请考虑以下声明作为其中一部分 SomeClass
private Set<String> blah = new HashSet<String>();
Run Code Online (Sandbox Code Playgroud)
在课堂上制作,这是后来的
XStream xstream = new XStream(new JettisonMappedXmlDriver());
xstream.setMode(XStream.NO_REFERENCES);
StringBuilder json = new StringBuilder(xstream.toXML(SomeClass));
rd = (SomeClass) xstream.fromXML(json.toString());
Run Code Online (Sandbox Code Playgroud)
当我 @Test
assertTrue(rd.getBlah().size() == 0);
Run Code Online (Sandbox Code Playgroud)
我得到一个NPE上rd.getBlah()
当我,而不是初步初始化,将初始化放置到的构造函数 SomeClass
public SomeClass() {
blah = new HashSet<String>();
}
Run Code Online (Sandbox Code Playgroud)
同样的问题 - NPE开rd.getBlah()
当我修改getter以首先检查null时,它可以工作,但..
public Set<String> getBlah() {
if (blah == null)
return new HashSet<Sgring>();
return blah;
}
Run Code Online (Sandbox Code Playgroud)
我很困惑...为什么不XStream初始化变量以及是否需要延迟实例化?
XStream使用与JDK序列化相同的机制.使用带有优化反射API的增强模式时,它不会调用默认构造函数.解决方案是实现readResolve方法,如下所示:
public class SomeClass{
private Set<String> blah;
public SomeClass(){
// do stuff
}
public Set<String> getBlah(){
return blah;
}
private Object readResolve() {
if(blah == null){
blah = new HashSet<String>();
}
return this;
}
}
Run Code Online (Sandbox Code Playgroud)