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 :
Et l’équivalent avec les méthodes de XStream :
Et le résultat de la sérialisation d’un objet Person :
-
@XStreamAlias("person")
-
public class Person implements Serializable {
-
-
private String name;
-
private String firstname;
-
-
@XStreamImplicit(itemFieldName="email")
-
private List<Email> emails;
-
-
@XStreamImplicit(itemFieldName="tel")
-
private List<Tel> tels;
-
-
public Person() {
-
}
-
// utiliser xstream.processAnnotations(Person.class);
-
}
-
xstream.alias("person", Person.class);
-
xstream.addImplicitCollection(Person.class, "emails", "email", Email.class);
-
xstream.addImplicitCollection(Person.class, "tels", "tel", Tel.class);

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