Java XStream:在就地解组期间,XML中未提及的空字段

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;

我的项目使用XStream进行序列化,有时必须使用双参数形式的
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中没有要删除的代码 如果以根用户身份提供现有对象,则取消初始化字段。唯一的 替代方案目前是一个自定义转换器