我的代码是这样建模的:
class A {
private transient Foo foo = new Foo();
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
in.defaultReadObject();
foo = new Foo();
}
}
class B extends A {}
我将readObject()添加到A中,以便在反序列化期间,将初始化瞬态foo
。但是,我在代码中遇到了断点,并且可以看到XStream根本没有调用readObject()。我也尝试在类B中使用readObject()来调用A中的initFoo()函数,但这也不起作用。
网站上的常见问题解答似乎并不意味着任何其他样板是必要的。为什么没有被召唤?
答案 0 :(得分:2)
似乎XStream文档不正确,或者至少具有误导性。它在http://x-stream.github.io/faq.html#Serialization_initialize_transient中说,
在类层次结构中使用后者[readObject],不为基类调用readResolve。
但是,在我的问题中列出的代码中用readObject()
替换readResolve()
,它似乎被调用,foo正在被正确初始化。这很令人困惑,因为根据XStream和java.io.Serializable的文档,readObject()似乎是我需要的。
然而,方法内部的断点仍未被击中。它可能与调用这些Serializable方法的方式有关。