2013-07-26 2 views
1

ли XStream есть поддержка списков XML, подобных JAXB (https://jaxb.java.net/nonav/2.2.4/docs/api/javax/xml/bind/annotation/XmlList.html)XStream конвертер для XMLList (по аналогии с JAXB)

Например:

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

генерирует:

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

I я не могу найти какой-либо конвертер, который делает это. На самом деле, похоже, есть конвертер 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, но это должно быть хорошо, я подозреваю.

+0

В итоге я сделал то же самое! Благодаря :) – Ajay

Смежные вопросы