gpt4 book ai didi

java - OpenHFT Chronicle 队列写入标记为 transient 的字段

转载 作者:行者123 更新时间:2023-12-02 09:32:55 29 4
gpt4 key购买 nike

好的,我有几个类基本上是这样的。

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 的属性 vector 中有 B >BA 作为其属性 parent。通常,如果您尝试编写它,这将是一个问题,因为它会导致无限循环。因此,在 parent 上使用 transient 关键字。

但是,由于某种原因,OpenHFT 没有注册 parent 设置为 transient 的事实,并且仍在尝试写入它,导致我收到 StackOverflowException (呵呵,实际上是在询问 StackOverflowException在 Stack Overflow 上,这是第一次)。

关于为什么会发生这种情况有什么建议吗?

顺便说一句,我正在使用 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"} ]
}

因此很明显 transient 字段被忽略。

关于java - OpenHFT Chronicle 队列写入标记为 transient 的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57803098/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com