3

考虑以下声明作为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>();
}

同样的问题 -NPErd.getBlah()

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

public Set<String> getBlah() {
   if (blah == null)
      return new HashSet<Sgring>();
   return blah;
}

我很纳闷……为什么不XStream初始化变量,是否需要惰性实例化?

4

1 回答 1

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

参考

于 2012-04-04T22:34:11.110 回答