Есть ли способ поместить номер версии в XML, сгенерированный XStream?

Я сериализую свои domainObjects с помощью XStream.

Я хотел бы добавить некоторую информацию о версиях в сгенерированный xml-файл на случай, если моя модель домена изменится.

есть ли способ сделать это с помощью xstream ?

Я предпочел бы параметр с именем "version" в корневом теге (<object-stream>) но все остальное тоже было бы хорошо.

спасибо заранее.

2 ответов


вы можете зарегистрировать конвертер, который добавляет нужный тег управления версиями в корневой элемент

доменный класс

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;
    }
}

testcase

@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 класс для каждого из них


Проверьте следующий проект

XMT

позволяет предоставить методы миграции, чтобы можно было десериализовать старые версии сериализованных объектов.