xstream - 在自定义转换器中重用默认转换器

时间:2011-05-24 08:54:38

标签: java xstream

我正在使用xstream来处理xml字符串,但是对象的某些字段在版本之间发生了变化,所以我正在实现 自定义转换器。下面列出了字段更改的摘要,只有前两种字段类型不同。

Field    type1      type2
a        short      String
b        String     Object
c        List       List
d        Object     Object
.
.
.
x        String     String

我的当前转换器是专门处理每个字段的,这会导致unmarshal()方法中的大量'else if'条件

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();
        }
        ..
        ..
    }
}

是否有更聪明的方法将类型未更改的字段处理委派给默认的xstream转换器?

1 个答案:

答案 0 :(得分:3)

这个问题有点陈旧,但是我花了一些时间收集这些东西。

简单的解决方案是扩展ReflectionConverter而不是实现原始Converter接口。 ReflectionConverter是XStream中的默认转换器,因此覆盖了所需的内容和super其他所有内容。然后new XStream().register你的新转换器,你很好。