XStream est une bibliothèque Java qui permet de sérialiser et de désérialiser des objets en s’appuyant sur la réflexion et des Converters pour la plupart des types de base (Float, Integer, Collections, ...). La dernière version (1.3.1) fonctionne plutôt bien sous Android.
Il est possible de paramètrer la sérialisation afin d’adapter une classe Java à un format XML particulier et aussi d’éviter d’avoir le nom complet (avec le package) de la classe dans le XML de sortie. Pour cela, Xstream dispose d’annotations et des méthodes correspondantes dans XStream pour les version de Java antérieures à JavaSE 5.
Exemple avec les annotations :
  1. @XStreamAlias("person")
  2. public class Person implements Serializable {
  3.  
  4.     private String name;
  5.     private String firstname;
  6.  
  7.     @XStreamImplicit(itemFieldName="email")
  8.     private List<Email> emails;
  9.  
  10.     @XStreamImplicit(itemFieldName="tel")
  11.     private List<Tel> tels;
  12.  
  13.     public Person() {
  14.     }
  15.     // utiliser xstream.processAnnotations(Person.class);
  16. }
Et l’équivalent avec les méthodes de XStream :
  1. xstream.alias("person", Person.class);
  2. xstream.addImplicitCollection(Person.class, "emails", "email", Email.class);
  3. xstream.addImplicitCollection(Person.class, "tels", "tel", Tel.class);
Et le résultat de la sérialisation d’un objet Person :
Au niveau des limitations, la plateforme Android ne supporte pas les parseurs StAX et par conséquent le Driver JettisonMappedXmlDriver qui permet de sérialiser/désérialiser en JSON. De plus, XStream s’appuie sur la variable «java.specification.version» afin de déterminer la version de Java : Android fixe cette variable à 0.9, ce qui désactive la gestion des annotations Xstream.
Toutefois, il est possible d’étendre la classe XStream et de redéfinir la méthode qui crée les classes de mapping afin de pouvoir utiliser les annotations Xstream. Il s’agit de la classe AndroidXStream dans l’archive zip associée à ce billet.
L’analyse des annotations est beaucoup plus lente que les méthodes de la classe XStream mais ces dernières rendent le code plus difficile à maintenir à mon goût.
Il est également possible d’utiliser le Driver JsonHierarchicalStreamDriver afin de sérialiser un objet en JSON, par contre la désérialisation n’est pas supportée. Il faudra alors utiliser les classes du package org.json (déjà présent dans l’API Android).
XStream se révèle particulièrement utile avec les Web Services qui utilisent des formats assez complexes. Pour persister des données en local les classes ObjectOutputStream et ObjectInputStream seront plus efficaces.
Vous trouverez un projet d’exemple dans cette archive : XstreamDemo.zip