我有这样建模的代码:
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 {}
我向A添加了readObject(),以便在反序列化期间,将初始化瞬态
foo
。但是,我在代码中插入了断点,并且可以看到XStream根本没有调用readObject()。我还尝试将readObject()粘贴在类B中,该类在A中调用initFoo()函数,但该方法也不起作用。网站上的常见问题解答似乎并不意味着需要其他任何样板即可正常工作。为什么不叫它?
最佳答案
XStream文档似乎不正确,或者至少具有误导性。在http://x-stream.github.io/faq.html#Serialization_initialize_transient中说,
在类层次结构中使用后一个[readObject],基类不调用readResolve。
但是,在我在问题中列出的代码中,用readObject()
替换readResolve()
似乎已被调用,并且foo正在正确初始化。但是,这令人困惑,因为根据XStream和java.io.Serializable的文档,readObject()似乎是我所需要的。
但是,该方法内部的断点仍未命中。可能与这些Serializable方法的调用方式有关。
关于java - XStream不会调用readObject(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15752945/