Last modified 8 years ago Last modified on 07/04/2009 14:43:36

XStream

Navigation

XStream est une librairie Java très simple à utiliser et qui permet de sérialiser et désérialiser des objets Java en XML.

Exemple basique

Voir aussi le tutoriel rapide sur le site.

Sans plus tarder un exemple pour voir tout de suite de quoi il s'agit. Pour cela, lisez le fichier documenté Test.java?.

Le résultat de l'exécution de ces quelques lignes est le suivant :

 - 1st step -
<examples.xstream.Test>
  <number>5</number>
</examples.xstream.Test>

 - 2nd step -
2

Intérêt

Je pense que si vous avez bien examiné l'exemple ci-dessus, vous devez commencer à apercevoir l'utilisation qui peut en être faite.

En effet, depuis nos premières leçons de programmation, on nous répète qu'il ne faut pas coder "en dur" les paramètres d'un programme dans le code source lui même. Et c'est à juste titre, car pour rappel, le risque est de perdre des paramètres enfouis dans le code, ce qui rend la modification de ces paramètres peu conviviale. Cependant, en tant que programmeur pressé, rendre notre programme configurable peut prendre du temps et compliquer son développement (gestion des exceptions).

Avec XStream, paramétrer son programme avec un fichier XML devient très simple.

Avec des types complexes

Comme illustré dans l'exemple, on peut très simplement paramétrer les attributs d'un objet, cependant on peut aller beaucoup plus loin ! Effectivement, l'exemple présente une classe avec un attribut de type simple, mais XStream gère tous les types de manière récursive jusqu'à trouver un type qu'il sait gérer. Pour comprendre, regardez la liste des types gérés par XStream et comment il les convertit.

Collections

Si votre objet, ou récursivement un attribut de votre objet est une collection ou un tableau, les éléments de la liste seront eux mêmes traités. Pour l'illustrer, regardez ce deuxième exemple? et le fichier résultat produit?.

En regardant le fichier résultat (TestCollection.xml), on comprend bien comment le modifier pour obtenir la population que l'on veut par désérialisation.

Polymorphisme

Cette fonctionnalité n'est pas documenté à ma connaissance, mais XStream permet également de gérer les types polymorphes.

Premier exemple, si vous regarder le code source de l'exemple avec la collection d'objet?, vous pouvez observer que l'attribut population est déclaré de type List<Fish>. Hors java.util.List est une interface (un type abstrait), et c'est à l'initialisation que le type java.util.ArrayList est spécifié. En dehors de l'exemple, c'est une bonne habitude à prendre?, cela permet de ne pas se restreindre à une implémentation de liste et de pouvoir en changer par la suite sans trop de modification. De manière générale, le choix de l'implémentation d'une interface peut devenir un paramètre du modèle en tant que choix d'un algorithme pour résoudre un problème ou effectuer un calcul.

Le choix de l'implémentation de l'interface java.util.List de l'attribut population peut être fait à l'aide d'un paramètre dans la balise XML de cet attribut. Ainsi, on peut choisir que notre population utilisera une liste chainée qui est plus performante pour les suppressions aléatoires en modifiant le fichier TestCollection.xml? de la sorte :

<examples.xstream.TestCollection>
  <population class="java.util.LinkedList">
  </population>
</examples.xstream.TestCollection>

Notez bien le paramètre class de l'élément population.

Un autre exemple? en reprenant le premier donné sur cet page, dont voici le résultat :

 - 1st step -
<examples.xstream.TestPolymorphism>
  <number class="int">5</number>
</examples.xstream.TestPolymorphism>

 - 2nd step -
2.5

Limites

Bon XStream, c'est génial, mais bon éditer un fichier xml pour configurer son modèle n'est pas forcément très convivial pour tout le monde. Surtout si on n'a pas de logiciel un tant soit peu évolué pour éditer ce genre de fichier très verbeux, pour ma part j'utilise kxmleditor.

C'est entre autres à partir de cette limite qu'est né l'idée d'OhOUI.

Attachments