La sérialisation est un mécanisme de conversion d'un objet en un flux d'octets pour un stockage ou une transmission ultérieure. En Java, la sérialisation est apparue avec la plateforme dans la version 1.1 comme partie de l'API en raison de la popularité des applications distribuées et de la nécessité d'échanger des données entre elles. Cette solution a permis de simplifier le transfert de graphes d'objets complexes entre les JVM et de sauvegarder leur état, rendant le processus transparent pour le développeur.
Le problème de la sérialisation réside dans la nécessité de respecter strictement l'intégrité des données, de maintenir la version des classes et de gérer correctement des structures complexes (comme des graphes avec des références cycliques). Tous les objets ne sont pas sérialisables (par exemple, les flux, les sockets, les ressources du système d'exploitation), et la sérialisation nécessite une attention particulière à la sécurité.
Solution mise en œuvre à l'aide de l'interface Serializable:
import java.io.*; class Person implements Serializable { private static final long serialVersionUID = 1L; private String name; private transient int age; // non sérialisable public Person(String name, int age) { this.name = name; this.age = age; } }
À l'aide de ObjectOutputStream et ObjectInputStream, un objet peut être écrit dans un fichier et récupéré :
Person p = new Person("Alice", 30); ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.ser")); oos.writeObject(p); // sérialisation ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.ser")); Person restored = (Person) ois.readObject();
Caractéristiques clés :
Serializable.transient ne sont pas sérialisés.Peut-on sérialiser un objet avec un champ non sérialisable, même s'il n'est pas utilisé ?
Réponse : Si le champ est marqué comme transient, il ne sera pas du tout sérialisé, et le processus ne générera pas d'exception, même si son type n'implémente pas Serializable. Si le champ n'est pas sérialisable et n'est pas transient, une exception NotSerializableException sera levée.
Un champ statique est-il sérialisable si la classe implémente Serializable ?
Réponse : Non, les champs statiques ne sont pas sérialisés, car ils appartiennent à la classe et non à l'instance. Seul l'état de l'instance est sauvegardé.
Que se passera-t-il si la structure de la classe est modifiée après la sérialisation (par exemple, ajout ou suppression d'un champ) ?
Réponse : Si vous spécifiez une version serialVersionUID, et que la structure a été modifiée de manière incompatible, une InvalidClassException apparaîtra lors de la désérialisation. Pour garantir la compatibilité, des indices de sérialisation et une gestion manuelle de serialVersionUID sont utilisés.
Les ingénieurs ont décidé de sérialiser un objet sans ajouter serialVersionUID et sans déclarer les champs qui font référence à des ressources système comme transient. Après la mise à jour de l'application et de la classe, une InvalidClassException est survenue et l'objet a perdu son intégrité, la désérialisation a cessé de fonctionner.
Avantages :
Inconvénients :
Une classe portable a été mise en œuvre pour la sérialisation avec un serialVersionUID explicite, tous les champs-ressources ont été déclarés comme transient, et la sérialisation manuelle contrôle les points clés.
Avantages :
Inconvénients :