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.
|