XMLList的XStream转换器(类似于Jaxb) [英] XStream converter for XMLList (similar to Jaxb)

查看:189
本文介绍了XMLList的XStream转换器(类似于Jaxb)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

XStream是否支持类似于JAXB的xml列表?( https://jaxb.java.net/nonav/2.2.4/docs/api/javax/xml/bind/annotation/XmlList.html

Does XStream have support for xml lists similar to JAXB?(https://jaxb.java.net/nonav/2.2.4/docs/api/javax/xml/bind/annotation/XmlList.html)

例如:

 @XmlRootElement
 public class MyClass {
     @XmlElement
     @XmlList
     List<Integer> values;
     //+ getter & setters
 }

生成:

 <myClass>
   <values>1 2 3 4 5</values>
 </myClass>

我无法找到任何执行此操作的转换器。事实上,似乎有一个转换器 com.thoughtworks.xstream.converters.collections.BitSetConverter ,它将BitSet序列化为逗号分隔列表。

I am not able to locate any converter that does this. In fact, there seems to be a converter com.thoughtworks.xstream.converters.collections.BitSetConverter that serializes BitSet as comma separated list.

推荐答案

您可以创建自定义SingleValueConverter来转换列表:

You can create a custom SingleValueConverter to convert the list:

public class IntegerListConverter implements SingleValueConverter {
    @Override
    public boolean canConvert(Class clazz) {
        return List.class.isAssignableFrom(clazz);
    }

    @Override
    public Object fromString(String arg0) {
        Collection<Integer> collection = new ArrayList<Integer>();
        String[] integerStrings = arg0.split(" ");
        for (int i = 0; i < integerStrings.length; i++) {
            collection.add(Integer.valueOf(integerStrings[i]));
        }
        return collection;
    }

    @Override
    public String toString(Object arg0) {
        List collection = (List) arg0;
        StringBuffer sb = new StringBuffer();
        boolean first = true;
        for (Object object : collection) {
            if (first) {
                first = false;
            } else {
                sb.append(' ');
            }
            sb.append(object.toString());
        }
        return sb.toString();
    }
}

List<整数> 是一个通用的界面,使事情有点复杂。 canConvert 的这种实现将为包含除Integers之外的其他内容的列表提供误报。我不确定clazz参数是否包含足够的信息来确定泛型类型参数。所以最安全的可能是仅将转换器分配给该单个字段:

The fact that List<Integer> is a generic interface makes things a little complicated. This implementation of canConvert will give false positives for Lists that contain other things than Integers. I'm not sure if the clazz parameter contains enough information to determine the generic type arguments. So the safest probably is to assign the converter to that single field only:

public class MyClass {
     @XStreamConverter(IntegerListConverter.class)
     List<Integer> values;
     //+ getter & setters
}

此外,此实现 fromString 将始终生成一个ArrayList,但我怀疑它应该没问题。

Also, this implementation of fromString will always generate an ArrayList, but that ought to be fine I suspect.

这篇关于XMLList的XStream转换器(类似于Jaxb)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆