2010-09-27 5 views
4

J'ai le (héritage, non annotée) classe suivante qui est sérialisé avec un convertisseur personnalisé:XStream: comment marshaler/unmarshal les listes dans un convertisseur personnalisé?

class Test { 

    // some other variables 

    List<SomeType> someTypeList; 

} 

Un convertisseur fonctionne correctement pour UnType est déjà disponible. Cependant, je veux que la liste soit sérialisée comme si elle était annotée avec @XStreamAlias ​​("someTypes").

En fin de compte, je pense le format suivant pour someTypeList:

<someTypes class="list-type"> 
    <someType> 
     .... 
    </someType> 
    ... 
</someTypes> 

Comment dois-je mettre en œuvre le maréchal/méthode unmarshal pour obtenir la sortie désirée? L'appel de context.convertAnother (someTypeList) n'a pas donné le résultat attendu car la balise <someTypes> environnante était manquante.

Répondre

0

Y a-t-il un addImplicitCollection appelé sur l'objet xstream lors de la configuration quelque part qui provoque le saut de la balise someTypes?

+0

L'annotation @XStreamImplicit ignore la balise parent de la collection. – digz6666

3

Vous sage pour obtenir la structure:

<someTypes class="list-type"> 
<someType> 
.... 
</someType> 
... 
</someTypes> 

Regardez le code suivant. Pour votre liste, vous devez marquer:

@XStreamImplicit(itemFieldName="someType") 
List<someType>List; 

Maintenant, en fonction de ce que vous avez à l'intérieur, vous pourriez avoir besoin de créer un convertisseur personnalisé. Pour faire référence à ce que vous changez un peu comme ceci:

@XStreamImplicit(itemFieldName="someType") @XStreamConverter(YourOwnConverter.class) 
List<SomeType> someTypeList; 

Ensuite, créez une classe de conversion (YourOwnConverter) qui sait comment un/maréchal:

public boolean canConvert(Class type) 
{ 
    return type.equals(SomeType.class); 
} 

public void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context) 
{ 
    SomeType mytype = (SomeType) source; 
    writer.addAttribute("position", mytype.getPosition()); 
    writer.setValue(mytype.getId()); 
} 
public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) 
{ 
    SomeType mytype = new SomeType(); 
    String position = reader.getAttribute("position"); 
    ...... 
     return mytype ; 
} 

utiliser comme exemple: http://x-stream.github.io/converter-tutorial.html

+0

-1. Ça ne marche pas. Voir [cette réponse] (http://stackoverflow.com/a/16514526/390513) pour une utilisation correcte. – Kane

Questions connexes