我的项目使用XStream进行序列化,有时必须使用unmarshal
的双参数形式,将数据反序列化为现有的根对象。
通常情况下这很好。 problem来自一个对象最初具有非null
字段值,并且您正在加载根本没有提到该字段的数据(可能是因为它是通过编组同一个字段的另一个对象来生成的该字段为null的类)。在就地解编后,该领域仍然存在。例如,
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.XppDriver;
import java.io.StringReader;
import java.io.StringWriter;
public class Demo {
static class Data {
final String alpha;
final String bravo;
Data(String alpha, String bravo) {
this.alpha = alpha;
this.bravo = bravo;
}
}
public static void main(String[] args) {
Data d1 = new Data("one", "set");
Data d2 = new Data("two", null);
System.out.println(marshal(d1));
System.out.println(marshal(d2));
unmarshal(marshal(d2), d1);
System.out.println(marshal(d1));
}
static XStream xs = new XStream();
static XppDriver driver = new XppDriver();
static String marshal(Object o) {
StringWriter w = new StringWriter();
xs.marshal(o, driver.createWriter(w));
return w.toString();
}
static void unmarshal(String data, Object o) {
xs.unmarshal(driver.createReader(new StringReader(data)), o);
}
}
打印
<Demo_-Data>
<alpha>one</alpha>
<bravo>set</bravo>
</Demo_-Data>
<Demo_-Data>
<alpha>two</alpha>
</Demo_-Data>
<Demo_-Data>
<alpha>two</alpha>
<bravo>set</bravo>
</Demo_-Data>
因为d1.bravo
未被清除。
有没有办法指示unmarshal
方法取消设置输入中未明确提及的所有字段,以便在这种情况下d1
等于d2
?
如果失败了,是否可以在输入中放置特定请求特定字段未设置的内容?我尝试了<bravo/>
和<bravo><null/></bravo>
但没有成功 - bravo
字段在两种情况下都设置为空字符串。
答案 0 :(得分:1)
据用户名单上的JörgSchaible说:
XStream始终只设置XML中存在的元素。的领域 未初始化的对象始终为null。 XStream中没有代码 如果以root身份提供现有对象,则取消初始化字段。唯一的 替代品目前是定制转换器。