【问题标题】:XStream fromXML for moved propertyXStream fromXML 用于移动的属性
【发布时间】:2014-10-14 10:54:50
【问题描述】:

给定一个已序列化为 XML 的类 Parent。

class Parent {
  Object A; 
  Child child;
}

class Child {
  Object C;
  ...
}

如果属性C从Child对象移动到父对象,如下

class Parent {
  Object A; 
  Object C;
  Child child;
}

class Child {
  ...
}

对于更改前生成的 XML 文件,在使用 xstream 反序列化时,如何确保子 c 标签填充父代中的新属性?

【问题讨论】:

  • 我认为当你反序列化 xml 时,它已经生成了,所以它没有定义这个属性,不确定,但我认为它不会发生。

标签: java xml-serialization xstream


【解决方案1】:

一般object serializersXStreamJAXB 一样,在将某个类的对象转换为xml (marshalling) 时,它也会保存类的版本代码。

当类改变时,类的版本代码也会改变。
在这种情况下,上面提到的序列化工具会抱怨检测到的变化,并且不会unmarshal 回避避免致命的运行时错误。

【讨论】:

    【解决方案2】:

    由于你在反序列化xml,它已经生成了,并且生成了一个serialVersionUID(这意味着如果再次编译的类有任何差异,将生成另一个serialVersionUID),所以它没有这个在其上定义的属性,当您对其进行反序列化并尝试强制转换时,它将引发异常。

    您必须反序列化两个类(父类和子类)并将其设置为如下代码:

    XStream xstream = new XStream();
    
    NewParent newParent = new NewParent();
    OldParentWithoutC oldParent = (OldParentWithoutC) xstream.fromXML(xml);
    OldChild oldChild = (OldChild) xstream.fromXML(xml);
    
    newParent.setObjectC(oldChild.getC());
    String xml = xstream.toXML(newParent);
    

    然后你可以再次序列化它。

    【讨论】:

    • 从 XML 中只提取一个字段怎么样?这可能与xstream有关吗?是否需要自定义转换器?
    • 我不这么认为,但我不是 XStream 专家,所以也许你可以在这里找到答案:xstream.codehaus.org/converter-tutorial.html 但是因为你没有完整的对象来序列化和反序列化它,它可能不会工作
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-16
    • 1970-01-01
    • 2013-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多