2013-04-01 3 views
2

У меня есть код, который смоделирован как таковые:XStream не будет вызывать readObject()

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() к А так, что во время десериализации, переходный foo будет инициализирован. Тем не менее, я оставил точки останова в своем коде и мог видеть, что XStream вообще не вызывает readObject(). Я также попытался приклеить readObject() в классе B, который вызывает функцию initFoo() в A, и это тоже не сработало.

Часто задаваемые вопросы на веб-сайте, похоже, не подразумевают, что для этого требуется какой-либо другой шаблон. Почему это не называется?

+0

Я не думаю, что XStream использует инфраструктуру сериализации Java. Я полагаю, что эти методы используются, только если вы используете 'ObjectOutput/InputStream'. –

+0

XStream использует спецификацию сериализации Java. http://xstream.codehaus.org/faq.html#Serialization_initialize_transient – eipark

+0

Я стою исправлено. –

ответ

2

Похоже, что документация XStream была неправильной или, по крайней мере, вводила в заблуждение. Он говорит, что в http://x-stream.github.io/faq.html#Serialization_initialize_transient,

Использование последнего [readObject] в иерархии классов, readResolve не вызывается для базовых классов.

Однако замена readObject() с readResolve() в коде я перечислил в моем вопросе, это, кажется, называется и Foo инициализируется правильно. Это запутывает, потому что, согласно документации как XStream, так и java.io.Serializable, readObject(), похоже, является тем, что мне нужно.

Точка останова внутри метода все еще не попадает. Возможно, это связано с тем, как вызываются эти методы Serializable.