« Bonjour, Amigo ! Je voudrais ajouter un petit quelque chose à ce qu'Ellie t'a dit. »

Parfois, tu auras besoin de contrôler le processus de sérialisation. Voici quelques raisons possibles :

1) Un objet n'est pas prêt pour la sérialisation : son état interne actuel est en train de changer.

2) Un objet contient des objets non sérialisables, mais peut les convertir en une forme qui peut être facilement sérialisée, par exemple en les enregistrant comme un tableau d'octets ou autre chose.

3) Un objet veut désérialiser toutes ses données comme une unité et/ou les chiffrer avant sérialisation.

Il y a beaucoup de raisons pour lesquelles tu pourrais vouloir effectuer manuellement la sérialisation. Mais nous ne voulons pas perdre tous les avantages que la sérialisation standard offre. Après tout, notre objet pourrait utiliser d'autres objets. Mais ils ne peuvent pas être sérialisés si notre objet ne prend pas en charge la sérialisation.

Cette situation a aussi une solution : l'interface Externalizable. Nous devons remercier les créateurs visionnaires de Java. Remplace simplement l'interface Serializable par l'interface Externalizable, et ta classe pourra gérer le processus de sérialisation manuellement.

L'interface Externalizable dispose de deux méthodes que l'interface Serializable ne possède pas et qui sont appelées par la machine Java quand un objet est sérialisé. Voici à quoi ça ressemble :

Code
class Cat implements Externalizable
{
 public String name;
 public int age;
 public int weight;

 public void writeExternal(ObjectOutput out)
 {
  out.writeObject(name);
  out.writeInt(age);
  out.writeInt(weight);
}

 public void readExternal(ObjectInput in)
 {
  name = (String) in.readObject();
  age = in.readInt();
  weight = in.readInt();
 }
}

Ça ne te rappelle pas quelque chose ?

« Nom d'une pipe en bois ! C'est exactement comme ça que nous avons essayé d'enregistrer des objets avant de connaître la sérialisation. »

« Cela simplifie tout : si la sérialisation standard est adéquate, nous héritons seulement de l'interface Serializable. Sinon, nous héritons d'Externalizable et nous écrivons notre propre code pour enregistrer/charger notre objet. »

« Mais une classe marquée comme Externalizable est-elle considérée comme sérialisable ? Peut-on utiliser la classe pour stocker 'de façon sûre' des références à nos classes sérialisables ? »

« Oui. Si une classe implémente Serializable ou Externalizable, elle est considérée comme sérialisable. »

« C'est la solution parfaite. J’aime ça. »

« Je suis ravi de l’entendre. Mais ce n'est pas tout... Tu devrais demander au professeur Hans toutes les nuances. Car il y en a. Il tenait à te donner quelque chose à lire. »