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