Java - Sérialisation

Bonjour à tous, futurs magiciens Java !aujourd'hui, nous allons entamer un voyage passionnant dans le monde de la sérialisation Java. Ne vous inquiétez pas si vous êtes nouveau dans la programmation – je serai votre guide amical et nous allons procéder pas à pas. À la fin de ce tutoriel, vous sérialiserez des objets comme un pro !

Java - Serialization

Qu'est-ce que la Sérialisation ?

Avant de plonger dans le code, comprenons ce qu'est vraiment la sérialisation. Imaginez que vous avez un sandwich délicieux (un objet en termes Java) que vous voulez envoyer à votre ami par la poste. Vous ne pouvez pas simplement stuff le sandwich entier dans une enveloppe, n'est-ce pas ? Au lieu de cela, vous devriez le décomposer en ses ingrédients, les écrire sur une feuille de papier et l'envoyer. Lorsque votre ami le reçoit, il peut recréer le sandwich à l'aide des instructions. Ce processus de décomposition d'un objet en un format qui peut être facilement stocké ou transmis est appelé sérialisation. Le processus inverse – recréer l'objet à partir des données sérialisées – est appelé désérialisation.

Pourquoi avons-nous besoin de Sérialisation ?

La sérialisation est extrêmement utile en Java pour plusieurs raisons :

  1. Sauvegarde de l'état de l'objet : Vous pouvez sauvegarder l'état d'un objet et le recréer plus tard.
  2. Communication réseau : Vous pouvez envoyer des objets via un réseau.
  3. Mise en cache : Les objets sérialisés peuvent être stockés dans un cache pour un accès rapide.
  4. Copie profonde : Elle offre un moyen facile de créer une copie profonde d'un objet.

Maintenant, mettons-nous au travail et plongeons-nous dans le code !

Comment fonctionne la Sérialisation en Java

En Java, la sérialisation est intégrée dans le langage, ce qui rend notre vie beaucoup plus facile. Pour rendre un objet sérialisable, nous devons faire deux choses :

  1. Implémenter l'interface Serializable
  2. Assurer que tous les champs de l'objet sont également sérialisables

Créons une simple classe Person pour illustrer :

import java.io.Serializable;

public class Person implements Serializable {
private String name;
private int age;

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

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

Dans cet exemple, Person implémente Serializable. L'interface Serializable n'a pas de méthodes – c'est simplement une interface de marquage qui indique à Java que cette classe peut être sérialisée.

Sérialisation d'un Objet

Maintenant que nous avons notre classe Person, sérialisons un objet :

import java.io.*;

public class SerializationDemo {
public static void main(String[] args) {
Person person = new Person("Alice", 30);

try (FileOutputStream fileOut = new FileOutputStream("person.ser");
ObjectOutputStream out = new ObjectOutputStream(fileOut)) {
out.writeObject(person);
System.out.println("Person object serialized and saved to person.ser");
} catch (IOException e) {
e.printStackTrace();
}
}
}

Voici ce qui se passe :

  1. Nous créons un objet Person.
  2. Nous utilisons un FileOutputStream pour écrire dans un fichier nommé "person.ser".
  3. Nous enveloppons le FileOutputStream dans un ObjectOutputStream, qui effectue la sérialisation réelle.
  4. Nous appelons writeObject() pour sérialiser notre objet Person.
  5. Nous utilisons une bloc try-with-resources pour nous assurer que nos flux sont correctement fermés.

Lorsque vous exécutez cela, il crée un fichier appelé "person.ser" contenant l'objet Person sérialisé.

Désérialisation d'un Objet

Maintenant, désérialisons notre objet :

import java.io.*;

public class DeserializationDemo {
public static void main(String[] args) {
try (FileInputStream fileIn = new FileInputStream("person.ser");
ObjectInputStream in = new ObjectInputStream(fileIn)) {
Person person = (Person) in.readObject();
System.out.println("Deserialized Person object:");
System.out.println(person);
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}

Voici ce qui se passe :

  1. Nous utilisons un FileInputStream pour lire "person.ser".
  2. Nous l'enveloppons dans un ObjectInputStream pour la désérialisation.
  3. Nous appelons readObject() pour désérialiser l'objet et le caster en Person.
  4. Nous imprimons l'objet désérialisé.

Lorsque vous exécutez cela, vous devriez voir l'objet Person original imprimé !

Points Importants sur la Sérialisation en Java

  1. SerialVersionUID : Pour le contrôle de version de la sérialisation, vous pouvez définir un serialVersionUID dans votre classe :
public class Person implements Serializable {
private static final long serialVersionUID = 1L;
// ... reste de la classe
}
  1. Champs transitoires : Si vous avez des champs que vous ne souhaitez pas sérialiser (comme des données sensibles), marquez-les comme transient :
public class Person implements Serializable {
private String name;
private int age;
private transient String password; // Ce champ ne sera pas sérialisé
// ... reste de la classe
}
  1. Personnalisation de la sérialisation : Vous pouvez personnaliser le processus de sérialisation en implémentant les méthodes writeObject() et readObject() dans votre classe.

Méthodes pour Sérialiser et Désérialiser un Objet

Voici un tableau des principales méthodes utilisées pour la sérialisation et la désérialisation :

Méthode Description
ObjectOutputStream.writeObject(Object obj) Sérialise un objet
ObjectInputStream.readObject() Désérialise un objet
Externalizable.writeExternal(ObjectOutput out) Méthode de sérialisation personnalisée
Externalizable.readExternal(ObjectInput in) Méthode de désérialisation personnalisée

Conclusion

Félicitations ! Vous avez juste pris vos premiers pas dans le monde de la sérialisation Java. Nous avons couvert ce qu'est la sérialisation, pourquoi elle est utile et comment l'implémenter en Java. Rappelez-vous, la pratique fait le maître, donc n'hésitez pas à expérimenter avec différents objets et scénarios.

Au fur et à mesure de votre parcours Java, vous trouverez la sérialisation qui apparaît dans divers contextes – allant de la sauvegarde des états de jeu à l'envoi de données via des réseaux. C'est un outil puissant dans votre boîte à outils de programmation.

Continuez à coder, à apprendre et, surtout, à vous amuser ! Qui sait, peut-être un jour vous sérialiserez des mondes virtuels entiers. En attendant, continuez à coder !

Credits: Image by storyset