1

XStream 是否支持类似于 JAXB 的 xml 列表?( 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 序列化为逗号分隔列表。

4

1 回答 1

1

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

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<Integer>使事情变得有点复杂。的这种实现canConvert将对包含除整数以外的其他内容的列表给出误报。我不确定 clazz 参数是否包含足够的信息来确定泛型类型参数。所以最安全的可能是将转换器分配给该单个字段:

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

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

于 2013-09-01T17:01:19.257 回答