Le mécanisme mis en 3#3uvre par ces classes,
appelé sérialisation a pour but
non seulement de représenter les objets par « une série » d'octets,
mais aussi et surtout de faire en sorte qu'un objet partagé (par
exemple, figure 5.2, p. ) ne soit
sauvegardé qu'en un seul exemplaire, et que le partage puisse être
reconstitué à la désérialisation. Ce mécanisme permet en particulier de
rendre persistants des objets en les
sérialisant dans un flot connecté à un fichier. En outre, il est
essentiel pour toutes les applications distribuées où les objets sont
mobiles dans un réseau, mais ceci dépasse le cadre de ce cours.
Seuls les objets dont la classe réalise l'interface Serializable peuvent bénéficier de la sérialisation. La plupart des classes des bibliothèques réalisent cette interface ; c'est notamment le cas de la classe String, des collections, des classes enveloppes. Les classes de flots et la classe Thread sont des exemples de classes non sérialisables. Si un objet sérialisable comporte des champs qui sont des références à d'autres objets sérialisables, ces objets sont aussi sérialisés.
Pour rendre sérialisable les objets d'une classe, il suffit donc de déclarer qu'elle réalise l'interface java.io.Serializable, qui ne déclare aucune méthode. Par exemple :
class Point implements java.io.Serializable { ... }
Ces fonctionnalités sont encore obtenues par décoration d'un flot.
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("toto")); oos.writeObject("Aujourd'hui"); oos.writeObject(new java.util.Date());
La lecture de ces objets, qui se fait dans le même ordre que leur écriture, doit opérer un transtypage d'Object vers la classe que l'on veut restituer (la lecture peut déclencher l'exception ClassNotFoundException qui doit être contrôlée) :
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("toto")); try { String chaîne = (String) ois.readObject(); java.util.Date date = (java.util.Date) ois.readObject(); // .. } catch (ClassNotFoundException e) {}