TUTORIELS 
La sérialisation dans Java
Explication et exemple de fonctionnement d'une API Java permettant de conserver des données entre deux programmes ou deux exécutions d'un programme, sous la forme de fichiers.  (16 juin 2003)
 

L'un des fondements de la programmation Orientée Objet réside dans l'idée de réutilisation. La plate forme Java collecte pour sa part les objets en mémoire afin qu'ils puissent être accédés à partir de n'importe quelle application Java. Cependant, cette réutilisabilité n'est valable que tant que la Java Virtual Machine (JVM) est lancée: si celle-ci est arrêtée, le contenu de la mémoire disparaît.

C'est ici que la sérialisation intervient : elle permet de stocker l'état des objets, ainsi que la manière de recréer cet objet pour plus tard. Un objet peut ainsi exister entre deux exécutions d'un programme, ou entre deux programmes : c'est la persistance objet. Ces objets stockés sont appelés des données série, c'est à dire envoyée une par une (à la manière du port série d'un ordinateur) et non simultanément (comme le port parallèle).

Le objets peuvent être sérialisés sur le disque dur interne, ou sur le réseau disponible (Internet compris). Pour rendre un objet persistant, il faut le sérialiser en implémentant l'interface java.io.Serializable au sein de la classe : Java saura alors quoi faire de l'objet.

import java.io.*;
import java.util.Date;
import java.util.Calendar;

public class Serialisation
  {
  public static void main(String [] args) throws IOException
    {
    PersistentTime time = new PersistentTime();
    FileOutputStream f = FileOutputStream("time");
    ObjectOutputStream o = ObjectOutputStream(f);
    o.writeObject(time);
    o.close();
    }
  }

public class PersistentTime implements Serializable
  {
  private Date time;
  public PersistentTime()
    {
    time = Calendar.getInstance().getTime();
    }
  public Date getTime()
    {
    return time;
    }
  }

Le programme crée alors une instance de PersistentTime, modifie la valeur time puis sérialise l'objet à l'aide d'un flux ObjectOutputStream enveloppé dans un FileOutputStream. L'objet sérialisé est alors enregistré sur le disque dans un fichier nommé time. C'est l'appel à la méthode o.writeObject() qui lance la sérialisation. On obtient un fichier nommé "time".

Pour récupérer l'objet, il faut alors passer par le code suivant :

import java.io.*;
import java.util.Date;
import java.util.Calendar;

public class Deserialisation
  {
  public static void main(String [] args) throws IOException
    {
    FileInputStream f = new FileInputStream("time");
    ObjectIntputStream o = ObjectInputStream(f);
    time = (PersistantTime)o.readObject();
    o.close();

    System.out.println("Donnée sauvée: " + time.getTime());
    System.out.println("Donnée actuelle: " + Calendar.getInstance().getTime());
    }
  }

Inversement, donc, c'est o.readObject() qui permet de lancer la désérialisation. On affiche ensuite la valeur stockée et la valeur en cours pour comparaison.

 
[ Xavier Borderie,JDNet
 
Accueil | Haut de page