2012-04-04 3 views
2

Рассмотрим следующую декларацию в рамках SomeClassинициализации переменной мимо Xstream

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()

Когда я изменить сорбент для проверки нулевой первых, он работает , но ..

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

Я озадачен ... Почему XStream не инициализировать переменные и нужна ли ленивая инстанция?

+0

Я немного запутался xstream.toXML (SomeClass); Разве это не xstream.toXML (объект), где объект имеет тип SomeClass? – Max

+0

Если есть что-то, что мы знаем, это то, что 'SomeClass', безусловно, относится к типу' SomeClass' :) – JAM

+0

Моя мысль заключалась в том, что вы взяли то, что вы написали выше по номиналу, если SomeClass - это тип, тогда ваш код выше не компилировать. SomeClass не имеет тип SomeClass, и не является SomeClass.class типа SomeClass ... – Max

ответ

4

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

+0

Спасибо. Действительно, это работает !. Две вещи: можете ли вы предоставить ссылку на вышеизложенное и как я могу узнать, работает ли я в расширенном режиме или нет? – JAM

+0

@JAM, 1) Я предоставил ссылку ниже фрагмента кода и 2) я не уверен, но я считаю, что он работает в этом режиме по умолчанию .. – mre

+0

Почему readObject() не работает в этом случае? У меня есть аналогичная проблема: http://stackoverflow.com/questions/15752945/xstream-wont-call-readobject, в которой readObject() кажется правильным решением, но работает только readResolve(). – eipark

Смежные вопросы