好的,所以我有几个基本上像这样的类。
public class Foo implements Serializable {
private A a;
//More code
}
public class A implements Serializable {
public Vector vector = new Vector();
//More code
}
public class B implements Serializable {
private transient A parent;
//More code
}
public static void main(String[] args) {
A a = new A();
a.vector.add(new B(a));
Foo foo = new Foo(a);
//More code to write foo with OpenHFT
}
因此,这里的奇怪之处在于,A和B周期性地指向彼此,其中
A
在其属性B
中具有vector
,而B
将A
作为其属性parent
。通常,如果您尝试编写它,将是一个问题,因为它将导致无限循环。因此,在transient
上使用parent
关键字。但是,由于某种原因,OpenHFT并未注册
parent
设置为瞬态的事实,并且仍在尝试编写它,导致我得到了StackOverflowException(嘿,实际上是在Stack Overflow上询问StackOverflowException,这是第一次) 。关于为什么会发生这种情况的任何建议?
顺便说一句,我正在使用Maven导入OpenHFT,并且正在使用5.17.17版本
最佳答案
我不知道您如何获得StackOverflowException,您的代码(进行了一些明显的修改以使其有意义)对我而言有效:
public class Test {
public static class Foo implements Serializable {
private A a;
public Foo(A a) {
this.a = a;
}
//More code
}
public static class A implements Serializable {
public Collection<B> vector = new Vector<>();
//More code
}
public static class B implements Serializable {
private transient A parent;
private String name;
public B(A a, String name) {
this.parent = a;
this.name = name;
}
//More code
}
public static void main(String[] args) {
A a = new A();
a.vector.add(new B(a, "name"));
Foo foo = new Foo(a);
Bytes bytes = Wires.acquireBytes();
final ValueOut out = WireType.JSON.apply(bytes).getValueOut();
out.marshallable(foo);
System.err.println(bytes.toString());
}
}
这将输出:
"a":{"vector":[ {"name":"name"} ]
}
因此很明显,瞬变场被忽略了。
关于java - OpenHFT Chronicle Queue写入字段标记为 transient ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57803098/