【问题标题】:xstream - reusing the default converter in a custom converterxstream - 在自定义转换器中重用默认转换器
【发布时间】:2011-05-24 08:54:37
【问题描述】:

我正在使用 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 转换器?

【问题讨论】:

    标签: java xstream


    【解决方案1】:

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

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

    【讨论】:

    • 它可以像这样内联注册:xStream.registerConverter(new ReflectionConverter(xStream.getMapper(), xStream.getReflectionProvider()) { ... }); 其中xs 是手头的XStream
    猜你喜欢
    • 1970-01-01
    • 2019-11-26
    • 2014-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多