View Source

We demonstrate usage of this tool with a simple tutorial. Assume a _Task_ class below with a _prioritized_ field indicating whether it is a prioritized task:
{code}
package example;

public class Task {
public boolean prioritized;
}
{code}
With XStream, we can serialize object of this class to XML like below:
{code}
import com.thoughtworks.xstream.XStream;

Task task = new Task();
task.prioritized = true;
String xml = new XStream().toXML(task);
saveXmlToFileOrDatabase(xml);
{code}
The resulting XML will be:
{code}
<example.Task>
<prioritized>true</prioritized>
</example.Task>
{code}
And you can deserialize the XML to get back task object:
{code}
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;

String xml = readXmlFromFileOrDatabase();
Task task = (Task)(new XStream(new DomDriver()).fromXML(xml));
{code}
Everything is fine. Now we find a prioritized flag is not enough, so we enhance the Task class to use a numeric priority field ranging from 1 to 10:
{code}
package example;

public class Task {
public int priority;
}
{code}
However deserialization of previously saved xml is no longer possible since the new Task class is not compatible with previous version. XMT comes to rescue: it introduces class _VersionedDocument_ to version serialized XMLs and handles the migration. With XMT, serialization of task object can be written as:
{code}
package example;
import com.pmease.commons.xmt.VersionedDocument;

Task task = new Task();
task.prioritized = true;
String xml = VersionedDocument.fromBean(task).toXML();
saveXmlToFileOrDatabase(xml);
{code}
The resulting XML will be:
{code}
<?xml version="1.0" encoding="UTF-8"?>

<example.Task version="0">
<prioritized>true</prioritized>
</example.Task>
{code}
Compared with the XML generated by directly using XStream, an additional attribute _version_ is added to the root element indicating version of the class generating this XML. The value is set to _0_ unless there are migration methods defined in the class as we will introduce below.

The XMT version of deserializing task object from xml is:
{code}

{code}