2011-01-19 48 views
1

我有一个Java类,看起来像XStream的反序列化时,变量的类型改变

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

我有了写它使用XStream把的MyClass实例的XML文件。

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

是否可以改变这个字段的转换?或者我需要为全班MyClass写一个自定义转换器?

感谢, 杰夫

回答

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

+0

不幸的是,xml文件存储在客户端计算机上,所以我无法访问所有文件,也无法要求他们手动编辑它们。 – 2011-02-03 19:56:33

相关问题