Java XStream:在就地解组期间,XML中未提及的空字段
我的项目使用XStream进行序列化,有时必须使用双参数形式的Java XStream:在就地解组期间,XML中未提及的空字段,java,null,xstream,Java,Null,Xstream,我的项目使用XStream进行序列化,有时必须使用双参数形式的unmarshal,将数据反序列化到现有的根对象中 通常情况下,这很好。当一个对象最初有一个非null字段值,而您加载的数据根本没有提到该字段(可能是因为它是通过封送该字段为null的同一类的不同对象而产生的)。就地解组后,该字段仍处于设置状态。比如说, import com.thoughtworks.xstream.XStream; import com.thoughtworks.xstream.io.xml.XppDriver;
unmarshal
,将数据反序列化到现有的根对象中
通常情况下,这很好。当一个对象最初有一个非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。布拉沃
未被清除
是否有方法指示unmarshal
方法取消设置输入中未明确提及的所有字段,以便在这种情况下d1
等于d2
否则,是否可以在输入中放置某些内容,专门请求取消设置特定字段?我尝试了
和
但都没有成功,bravo
字段在这两种情况下都设置为空字符串。根据用户列表上的Jörg Schaible:
XStream始终只设置XML中存在的元素。田野
未初始化的对象始终为空。XStream中没有要删除的代码
如果以根用户身份提供现有对象,则取消初始化字段。唯一的
替代方案目前是一个自定义转换器