通过Xstream进行变量初始化

Jam*_*sev 3 java xstream

请考虑以下声明作为其中一部分 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)

我得到一个NPErd.getBlah()

当我,而不是初步初始化,将初始化放置到的构造函数 SomeClass

public SomeClass() {
  blah = new HashSet<String>();
}
Run Code Online (Sandbox Code Playgroud)

同样的问题 - NPErd.getBlah()

当我修改getter以首先检查null时,它可以工作,但..

public Set<String> getBlah() {
   if (blah == null)
      return new HashSet<Sgring>();
   return blah;
}
Run Code Online (Sandbox Code Playgroud)

我很困惑...为什么不XStream初始化变量以及是否需要延迟实例化?

mre*_*mre 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

参考