next up previous contents index
suivant: Les flots et l'Internet monter: Communications précédent: Flots de données   Table des matières   Index


Sérialisation

La classe ObjectOutputStream permet de sérialiser les objets de Java en les écrivant sur un flot, et symétriquement, la classe ObjectInputStream permet de désérialiser ces flots pour en extraire des objets.

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) {}


next up previous contents index
suivant: Les flots et l'Internet monter: Communications précédent: Flots de données   Table des matières   Index
Rene' LALEMENT 2002-11-07