有没有办法将版本号放在XStream生成的XML中?

时间:2009-06-04 07:31:00

标签: java xstream

我使用XStream序列化我的domainObjects。

我想在生成的xml文件中添加某种版本控制信息,以防我的域模型发生变化。

有没有办法使用xstream?

我更喜欢在根标签(<object-stream>)中使用名为“version”的参数,但其他任何东西都会很好。

提前致谢。

2 个答案:

答案 0 :(得分:9)

您可以注册转换器,将所需的版本控制标记添加到根元素

域类

class Person {

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

转换器

class PersonConverter implements Converter {

    public boolean canConvert(Class clazz) {
        return clazz.equals(Person.class);
    }

    public void marshal(Object value, 
                        HierarchicalStreamWriter writer, 
                        MarshallingContext context) {
        Person person = (Person) value;
        writer.addAttribute("version", "0");
        writer.startNode("fullname");
        writer.setValue(person.getName());
        writer.endNode();
    }

    public Object unmarshal(HierarchicalStreamReader reader, 
                            UnmarshallingContext context) {
        Person person = new Person();
        reader.moveDown();
        person.setName(reader.getValue());
        reader.moveUp();
        return person;
    }
}

测试用例

@Test
public void versioning() {
    Person person = new Person();
    person.setName("Davide");
    XStream xStream = new XStream(new DomDriver());
    xStream.registerConverter(new PersonConverter());
    xStream.alias("person", Person.class);
    System.out.println(xStream.toXML(person));
}

输出

<person version="0">
  <fullname>Davide</fullname>
</person>

更好的解决方案是装饰XStream提供的默认转换器来添加 所有域对象的版本控制属性,无需编写一个Converter 他们每个人的课程

答案 1 :(得分:1)

查看以下项目

XMT

允许您提供迁移方法,以便您可以反序列化旧版本的序列化对象。