代码之家  ›  专栏  ›  技术社区  ›  Łukasz Bownik

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

  •  8
  • Łukasz Bownik  · 技术社区  · 16 年前

    我使用xstream序列化我的域对象。

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

    有没有一种使用XStream的方法?

    我想在根标记中使用名为“version”的参数( <object-stream> )但其他的也不错。

    事先谢谢。

    2 回复  |  直到 16 年前
        1
  •  9
  •   dfa    16 年前

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

    领域类

    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 他们每个人的班级

        2
  •  1
  •   Mark O'Connor    15 年前

    签出以下项目

    XMT

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