Java : Sérialisation au format XML, dans un fichier ou une variable
Par Jonathan Lermitage le vendredi 21 décembre 2007, 14:03 - Sea, Java and Sun : Java SE ME EE, EDI - Lien permanent
Corrections (getters et setters) le vendredi 21 décembre 2007;
Java, comme la plupart des langages de programmation, propose la sérialisation (et opération inverse) d'objets.

Celle-ci peut s'effectuer au format binaire, méthode idéale si vous restez en Java et pour les performances.
Si vous cherchez une sérialisation 100% portable, il va falloir parler XML !
En effet, il est possible de sérialiser un objet, ou tableau d'objets, au format XML dans un flux (fichier ou simple variable). Cette méthode, bien que peu rapide, a l'avantage de proposer une entité sérialisé facilement désérialisable par n'importe quel langage de programmation. Il faudra juste interpréter correctement l'XML (le remettre un peu en forme) et le tour est joué.
Vous pourrez ainsi, par exemple, transmettre des structures de données via le réseau entre des applications WinDev et Java.
Dans les exemples qui vont suivre, nous (dé)sérialiserons l'objet notreObjet
issu de la classe ClasseDeNotreObjet
.
Sérialiser un objet (en XML) dans une chaine de caractères :
ByteArrayOutputStream out =
new ByteArrayOutputStream();
XMLEncoder e = new XMLEncoder(out);
e.writeObject(notreObjet);
e.close();
str_notreObjetSerialise = out.toString();
Ici, on a sérialisé l'objet notreObjet dans une chaine de caractères str_notreObjetSerialise
.
Le code est exactement le même si l'on veut sérialiser un tableau d'objets.
Désérialiser un objet (XML) à partir d'une chaine de caractères :
ByteArrayInputStream in =
new ByteArrayInputStream(
new String(str_notreObjetSerialise).getBytes());
XMLDecoder d = new XMLDecoder(in);
notreObjet = (ClasseDeNotreObjet) d.readObject();
d.close();
Ici, on a désérialisé l'objet notreObjet dà partir d'une chaine de caractères str_notreObjetSerialise
.
Pour désérialiser un tableau d'objets, il faudra remplacer le transtypage ClasseDeNotreObjet
par ClasseDeNotreObjet[]
.
Sérialiser un objet dans un fichier XML :
XMLEncoder e = new XMLEncoder(
new BufferedOutputStream(
new FileOutputStream("serialization.xml")));
e.writeObject(notreObjet);
e.close();
Désérialiser un objet à partir d'un fichier XML :
XMLDecoder d = new XMLDecoder(
new BufferedInputStream(
new FileInputStream("serialization.xml")));
notreObjet = (ClasseDeNotreObjet) d.readObject();
d.close();
Ce qu'il faut savoir :
Les classes XMLDecoder
et XMLEncoder
se trouvent dans le paquetage java.beans
Les classes ByteArrayInputStream
et ByteArrayOutputStream
, se trouvent dans le paquetage java.io
.
La classe à (dé)sérialiser au format XML doit implémenter l'interface serializable
, disposer d'un constructeur sans paramètres, et de tous les accesseurs en lecture/écriture utiles.
Attention : un accesseur en lecture sur l'attribut toto
doit être nommé getToto
, et l'accesseur en écriture doit être nommé setToto
(attention à la casse, Si un attribut ne possède pas d'accesseur en lecture il ne sera pas sérialisé. S'il possède un accesseur en lecture mais pas en écriture, alors une exception sera levée lors de la désérialisation).
Enfin, les valeurs des attributs ne doivent pas contenir de symboles pouvant corrompre l'XML, comme les signes <
et >
, les apostrophes, etc. Pensez à une adaptation préalable de vos données, comme par exemple le codage en Base64.
Bienvenue chez un

Commentaires