Конвертер XStream для XMLList (похож на Jaxb)

Поддерживает ли XStream списки xml, аналогичные 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 как разделенный запятыми список.

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, но это должно быть хорошо, я подозреваю.

Другие вопросы по тегам