将以下声明视为SomeClass
private Set<String> blah = new HashSet<String>();
在课堂上制作,稍后
XStream xstream = new XStream(new JettisonMappedXmlDriver());
xstream.setMode(XStream.NO_REFERENCES);
StringBuilder json = new StringBuilder(xstream.toXML(SomeClass));
rd = (SomeClass) xstream.fromXML(json.toString());
当我@Test
assertTrue(rd.getBlah().size() == 0);
我在NPE
rd.getBlah()
当我不是初步初始化时,将初始化放置到SomeClass
public SomeClass() {
blah = new HashSet<String>();
}
同样的问题 - NPE
上的rd.getBlah()
当我修改getter以首先检查null时,它可以工作,但是..
public Set<String> getBlah() {
if (blah == null)
return new HashSet<Sgring>();
return blah;
}
我很困惑...为什么XStream
没有初始化变量以及是否需要延迟实例化?
答案 0 :(得分:5)
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;
}
}