tags:

views:

200

answers:

2

I serialize my domainObjects using XStream.

I would like to add some kind of versioning information to a generated xml file just in case my domain model changes.

Is there a way to do it using xstream ?

I vould prefer a parameter named "version" in a root tag (<object-stream>) but anything else would be good too.

Thanks in advance.

+9  A: 

you can register your converter that adds the desired versioning tag to your root element

Domain class

class Person {

    private String name;

    public String getName() {
        return name;
    }

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

Converter

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

output

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

a better solution is to decorate the default converter provided by XStream to add versioning attribute to all domain objects without writing one Converter class for each of them

dfa
+1  A: 

Check out the following project

XMT

Allows you to provide migration methods so that you can deserialize older versions of serialized objects.

Mark O'Connor