I'm using xstream to process an xml string but some fields of the object have changed between versions, so i'm implementing a custom converter. A summary of the field changes is listed below, and only the first two field types are different.
Field type1 type2
a short String
b String Object
c List List
d Object Object
.
.
.
x String String
My current converter is implemented to handle each of the fields specifically, which leads to a large number of 'else if' conditions within the unmarshal() method
package a.b.c.reports;
import com.thoughtworks.xstream.converters.Converter;
import com.thoughtworks.xstream.converters.MarshallingContext;
import com.thoughtworks.xstream.converters.UnmarshallingContext;
import com.thoughtworks.xstream.io.HierarchicalStreamReader;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
public class MyConverter implements Converter {
..
@Override
public Object unmarshal(HierarchicalStreamReader reader,UnmarshallingContext context) {
while (reader.hasMoreChildren()) {
reader.moveDown();
if(reader.getNodeName().equals("a"))
{
a = reader.getValue();
}
else if (reader.getNodeName().equals("b"))
{
b = (Object) context.convertAnother(reader, Object.class);
}
else if(reader.getNodeName().equals("c"))
{
a = reader.getValue();
}
..
..
}
}
Is there a smarter way to delegate the processing of fields who's types have not changed to the default xstream converter?
xStream.registerConverter(new ReflectionConverter(xStream.getMapper(), xStream.getReflectionProvider()) { ... });
wherexs
is theXStream
at hand. – Boo