Aller au contenu

Sérialisation, désérialisation

c’est quoi ?

C’est un mécanisme d’écriture de l’état d’un objet dans un flux d’octets. Personnallement, je l’utilise pour les EJB, RMI, JMS, Socket et Hibernate ainsi que pour sauvegarder des objets dans un fichier et pouvoir les récupérer comme objets et non comme de simples données textuelles.

Principe :

serialisation-désérialisation

L’exemple ci-dessous est tiré du cours detaillé I/O - Fichier - Sérialisation

Exemple d’écriture / lecture des objets de type Chat (animal) dans un fichier

package enregistrerDesObjetsChats;
import java.io.Serializable;
/**
 * Projet 	: TP-exemple
 * Classe	: Chat.java
 * @author 	: Philippe Bouget
 * Date     : 03/10/2019
 */
public class Chat implements Serializable {

	private String petitNom;
	private int age;

	public Chat(String petitNom, int age)
	{
		this.petitNom=petitNom;
		this.age=age;
	}

	/**
	 * @return le petitNom
	 */
	public String getPetitNom() {
		return petitNom;
	}

	/**
	 * @param petitNom le petitNom à initialiser
	 */
	public void setPetitNom(String petitNom) {
		this.petitNom = petitNom;
	}

	/**
	 * @return le age
	 */
	public int getAge() {
		return age;
	}

	/**
	 * @param age le age à initialiser
	 */
	public void setAge(int age) {
		this.age = age;
	}
	public String toString()
	{
		return "Chat : :"+petitNom+" "+age+" ans";
	}
	public void afficher()
	{
		System.out.println("Chat : :"+petitNom+" "+age+" ans");
	}
}

Comme vous pouvez le constater dans la déclaration de la classe Chat, on implémente l’interface Serializable de la manière suivante :

public class Chat implements Serializable

Cela suffit pour rendre l’écriture, la transmission via un réseau et la lecture d’objets possible.

Exemple d’écriture des objets :

package enregistrerDesObjetsChats;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
/**============================================
	Ecriture d'objet dans un Fichier texte
	Gestion des flux entrée / sortie
	Auteur  		: Philippe Bouget
	Nom Programme	: EcrireObjet.java
==============================================
*/
public class EcrireObjet

{
	public static void main (String args[])
	{
		// on créer des objets de type Chat
		Chat minou = new Chat("Youpi",3);
		Chat poupou = new Chat("Poupou",4);
		Chat propret = new Chat("Propret",7);
		Chat pounette = new Chat("Pounette",8);
		try
		{
			FileOutputStream fichierDObjets = new FileOutputStream("ChatObj.txt");
			ObjectOutputStream fluxDObjets = new ObjectOutputStream(fichierDObjets);

			minou.afficher();
			fluxDObjets.writeObject(minou);

			poupou.afficher();
			fluxDObjets.writeObject(poupou);

			propret.afficher();
			fluxDObjets.writeObject(propret);

			pounette.afficher();
			fluxDObjets.writeObject(pounette);
			// on vide le tampon
			fluxDObjets.flush();
			// on ferme la fichier
			fluxDObjets.close();
			fichierDObjets.close();
			System.out.println("Fin de la copie du fichier");		
		}
		catch (IOException e) {e.getMessage();}

	}
}

Pour l’écriture des objets on déclare un objet du type ObjectOutputStream qui nous permet de faire appel à la méthode writeObject() pour sauvegarder un objet. Il faut bien entendu effectuer un flush() puis un close() du flux en sortie.

Exemple de lecture des objets depuis un fichier :

package enregistrerDesObjetsChats;
/**============================================
	Lecture d'objet dans un Fichier texte
	Gestion des flux entrée / sortie
	Auteur 			: Philippe Bouget
	Année			  : 2019
	Nom Programme	: LireObjet.java
==============================================
 */
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
public class LireObjet
{
	public static void main (String args[])
	{
		try
		{
			FileInputStream fichierDObjets = new FileInputStream("ChatObj.txt");
			ObjectInputStream fluxDObjets = new ObjectInputStream(fichierDObjets);
			while(true)	// tant qu'il y a des objets
			{
				Object o = fluxDObjets.readObject();
				if (o instanceof Chat)
				{
					((Chat)o).afficher();
				}
				else
				{
					System.out.println("Objet Non Identifié !");
				}
			}
		}
		catch (ClassNotFoundException e) {e.getMessage();}
		catch (IOException e) {e.getMessage();}
		System.out.println("Fin de la lecture");
	}
}

Pour la lecture des objets on déclare un objet du type ObjectInputStream qui nous permet de faire appel à la méthode readObject() pour sauvegarder un objet.