Sérialisation des objets en Java : guide complet pour débutants

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Sérialisation des objets en Java : qu'est-ce que c'est et pourquoi en a-t-on besoin ?



La sérialisation en Java est le processus de conversion de l'état d'un objet en un flux d'octets pour le sauvegarder dans un fichier, une base de données ou le transmettre sur un réseau. Le processus inverse — la reconstruction de l'objet à partir du flux d'octets — est appelé désérialisation. Cette technologie est à la base de nombreux frameworks Java : de RMI (Remote Method Invocation) aux systèmes de messagerie.



Dans cet article, nous allons voir comment fonctionne la sérialisation intégrée de Java, avec des exemples pratiques, et examiner les meilleures pratiques pour son utilisation.



Comment fonctionne la sérialisation en Java ?



Java fournit un mécanisme de sérialisation intégré via l'interface java.io.Serializable. Cette interface ne contient pas de méthodes — c'est une interface marqueur (marker interface). Si une classe implémente Serializable, la JVM autorise automatiquement la sérialisation de ses objets.



Pour écrire et lire des objets, deux classes principales du package java.io sont utilisées :



  • ObjectOutputStream — sérialise un objet en un flux d'octets
  • ObjectInputStream — désérialise un objet à partir d'un flux d'octets


Exemple simple de sérialisation



Créons une classe Person qui pourra être sérialisée :



import java.io.Serializable;

public class Person implements Serializable { private static final long serialVersionUID = 1L; private String name; private int age; private transient String password; // ne sera pas sérialisé

public Person(String name, int age, String password) { this.name = name; this.age = age; this.password = password; }

@Override public String toString() { return "Person{name='" + name + "', age=" + age + ", password='" + password + "'}"; }}


Écrivons maintenant le code pour la sérialisation et la désérialisation :



import java.io.*;

public class SerializationDemo { public static void main(String[] args) { Person person = new Person("Иван", 30, "secret123"); // Sérialisation try (FileOutputStream fos = new FileOutputStream("person.ser"); ObjectOutputStream oos = new ObjectOutputStream(fos)) { oos.writeObject(person); System.out.println("Objet sérialisé : " + person); } catch (IOException e) { e.printStackTrace(); }

// Désérialisation try (FileInputStream fis = new FileInputStream("person.ser"); ObjectInputStream ois = new ObjectInputStream(fis)) { Person restoredPerson = (Person) ois.readObject(); System.out.println("Objet restauré : " + restoredPerson); } catch (IOException | ClassNotFoundException e) { e.printStackTrace(); } }}


Sortie du programme :

Objet sérialisé : Person{name='Иван', age=30, password='secret123'}Objet restauré : Person{name='Иван', age=30, password='null'}


Remarquez : le champ password a été marqué avec le mot-clé transient et lors de la désérialisation, il a reçu la valeur null. C'est la méthode standard pour exclure les données confidentielles de la sérialisation.



Caractéristiques importantes de la sérialisation en Java



  • serialVersionUID — un identifiant unique de version de classe. Si vous ne le déclarez pas explicitement, la JVM le générera automatiquement, mais cela peut entraîner une erreur InvalidClassException lors de la modification de la classe. Il est recommandé de toujours déclarer private static final long serialVersionUID.
  • Les champs statiques ne sont pas sérialisés — ils appartiennent à la classe, pas à l'objet.
  • Objets imbriqués — si l'objet sérialisé contient des références à d'autres ob

Recommendations