1

我有一个看起来像的java类

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

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

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

是否可以仅更改这一字段的转换?还是我需要为整个班级编写一个自定义转换器MyClass

谢谢,杰夫

4

1 回答 1

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”是我用来填充你的新列表对象的一种方法。

于 2011-02-03T19:32:24.380 回答