好的,所以我有几个基本上像这样的类。

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,而BA作为其属性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/

10-11 10:54