Sérialisation d'objets Java : Persistance et restauration d'objets
Java fournit la sérialisation d'objets : représentation d'un objet comme séquence d'octets incluant ses données, son type et les types de données stockés.
Un objet sérialisé écrit dans un fichier peut être lu et désérialisé : les informations de type et octets recréent l'objet en mémoire.
Le processus est indépendant de la JVM : un objet peut être sérialisé sur une plateforme et désérialisé sur une autre.
Classes clés : ObjectInputStream et ObjectOutputStream (flux de haut niveau).
Méthodes principales
ObjectOutputStream.writeObject(Object x): sérialise et envoie au flux de sortieObjectInputStream.readObject(): récupère et désérialise le prochain objet. RetourneObject→ cast nécessaire
Conditions de sérialisation
- La classe doit implémenter
java.io.Serializable(interface marqueur, sans méthodes) - Tous les champs doivent être sérialisables. Sinon : marquer
transient
Vérification : si la classe implémente Serializable → sérialisable.
Exemple : classe Employee sérialisable
public class Employee implements java.io.Serializable {
public String name;
public String address;
public transient int SSN; // non sérialisé
public int number;
public void mailCheck() {
System.out.println("Envoi chèque à " + name + " " + address);
}
}
Sérialisation d'un objet
Classe ObjectOutputStream. Convention : extension .ser pour les fichiers sérialisés.
Exemple : SerializeDemo
import java.io.*;
public class SerializeDemo {
public static void main(String[] args) {
Employee e = new Employee();
e.name = "Reyan Ali";
e.address = "Phokka Kuan, Ambehta Peer";
e.SSN = 11122333;
e.number = 101;
try {
FileOutputStream fileOut = new FileOutputStream("/tmp/employee.ser");
ObjectOutputStream out = new ObjectOutputStream(fileOut);
out.writeObject(e);
out.close();
fileOut.close();
System.out.println("Données sérialisées sauvées dans /tmp/employee.ser");
} catch (IOException i) {
i.printStackTrace();
}
}
}
Désérialisation d'un objet
Classe ObjectInputStream.
Exemple : DeserializeDemo
import java.io.*;
public class DeserializeDemo {
public static void main(String[] args) {
Employee e = null;
try {
FileInputStream fileIn = new FileInputStream("/tmp/employee.ser");
ObjectInputStream in = new ObjectInputStream(fileIn);
e = (Employee) in.readObject();
in.close();
fileIn.close();
} catch (IOException i) {
i.printStackTrace();
return;
} catch (ClassNotFoundException c) {
System.out.println("Classe Employee introuvable");
c.printStackTrace();
return;
}
System.out.println("Employé désérialisé...");
System.out.println("Nom : " + e.name);
System.out.println("Adresse : " + e.address);
System.out.println("SSN : " + e.SSN);
System.out.println("Numéro : " + e.number);
}
}
Résultat :
Employé désérialisé...
Nom : Reyan Ali
Adresse : Phokka Kuan, Ambehta Peer
SSN : 0
Numéro : 101
Points importants
ClassNotFoundException: la JVM doit trouver le bytecode de la classe pour désérialiser. Si classe introuvable → exception.- Cast du retour de
readObject()vers le type concret - Champ
transient(SSN) : valeur non sérialisée. À la désérialisation, valeur par défaut (0 pour int). La valeur originale (11122333) est perdue.
Bonnes pratiques
- Déclarer
serialVersionUIDexplicite pour contrôler la compatibilité entre versions - Marquer
transientles champs sensibles (mots de passe) ou non sérialisables (connexions, threads) - Implémenter
writeObject/readObjectpour logique personnalisée - Préférer JSON (Jackson, Gson) ou Protocol Buffers pour l'interopérabilité moderne
Java
- Comprendre le mot-clé final en Java : variables, méthodes et classes
- L'opérateur instanceof en Java : guide complet
- Comprendre les classes imbriquées statiques en Java : utilisation, différences et exemples
- Maîtriser les classes internes anonymes en Java : définition, syntaxe et exemples pratiques
- Le pattern Singleton en Java expliqué : implémentation et utilisation sûre
- Maîtriser la réflexion Java : inspection des classes, méthodes et champs à l'exécution
- Maîtriser Java ObjectOutputStream : Sérialisation, méthodes et exemples pratiques
- Maîtriser les génériques Java : Construire du code réutilisable et type-safe
- Maîtriser les opérations sur les fichiers Java avec java.io – Création, lecture, écriture et suppression