变量类型更改时的XStream反序列化

时间:2011-01-19 18:37:35

标签: java xstream xml-deserialization

我有一个类似于

的java类
public class MyClass {
   private final String str;
   private Polygon polygon; // this polygon is a custom type of mine
}

我有一个xml文件,其中使用XStream写了一个MyClass实例。

现在MyClass已更改且多边形已替换为List<Polygon>,并且该字段已重命名为polygons,我正在尝试不破坏反序列化。我想更改polygon字段的反序列化以基本上读取多边形,然后只创建一个新列表并将单个多边形添加到它。该列表将是新的字段值。

是否可以更改此字段的转换?或者我是否需要为整个班级MyClass编写自定义转换器?

感谢, 杰夫

1 个答案:

答案 0 :(得分:1)

因此,根据您的评论,我相信您需要一个自定义转换器。

以下是一个例子:

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 MyClassConverter implements Converter{

    @Override
    public boolean canConvert(Class clazz) 
    {
        return clazz.equals(MyClass.class);
    }

    @Override
    public void marshal(Object value, HierarchicalStreamWriter writer,
            MarshallingContext context) 
    {

    }

    @Override
    public Object unmarshal(HierarchicalStreamReader reader,
            UnmarshallingContext context) 
    {
        // Create MyClass Object
        MyClass myClass = new MyClass();

        // Traverse Tree
        while (reader.hasMoreChildren()) 
        {
            reader.moveDown();
            if ("polygon".equals(reader.getNodeName())) 
            {
                Polygon polygon = (Polygon)context.convertAnother(myClass, Polygon.class);
                myClass.addPolygon(polygon);
            } 
            reader.moveUp();
        }

        // Return MyClass Object
        return myClass;
    }
}

如果你不知道,这里有参考指南:http://x-stream.github.io/converter-tutorial.html

现在,剩下要做的就是注册你的转换器,我假设你知道怎么做。无论如何,一个重要但值得注意的事情是'addPolygon'是我用来填充新列表对象的方法。

相关问题