通过Xstream进行变量初始化

时间:2012-04-04 22:27:23

标签: java xstream

将以下声明视为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没有初始化变量以及是否需要延迟实例化?

1 个答案:

答案 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;
    }
}

Reference