La sérialisation permet de rendre un objet persistant, en le "détricotant" pour le transformer en un flux d'octets qui pourra être stocké dans un fichier sur disque, ou transmis vers un client distant par une connexion réseau, et à l'inverse, en le "retricotant", le reconstituant à partir du flux.
Le mécanisme de sérialisation inclus dans java est standard et transparent: il suffit d'implémenter l'interface Serializable, qui fournit la capacité pour un objet d'être sauvegardé dans un flux et, au contraire, restitué à partir de celui-ci.
La sauvegarde concerne non seulement les attributs de l'objet, mais aussi tous les objets auxquels cet objet est lié: la sauvegarde se propage automatiquement à la grappe constituée par cet objet et ceux auxquels il est lié: par exemple, la sauvegarde d'un objet Echiquier inclut celle de ses Piece et de leur Position.
Le code source d'un exemple est donné ci-après, ainsi qu'un cas de sauvegarde et de restitution d'un objet au format csv, ce dernier peut aussi être lu et généré par MS-Excel. A noter que pour ce cas d'écriture et de lecture csv, ce n'est pas la sérialisation qui est utilisée, on réalise manuellement la décomposition et la recomposition des attributs de l'objet, notamment dans un constructeur au moyen d'un StringTokenizer, et dans la méthode toCsv()
Télécharger le polycopié + tp
Documentation:
Cours général: http://www.developpez.com/upload/vedaer/penserenjavaNew/
Fichiers: http://www.developpez.com/upload/vedaer/penserenjavaNew/?chap=12&page=2
Sérialisation: http://www.developpez.com/upload/vedaer/penserenjavaNew/?chap=12&page=4#04.036
Sérialisation: http://perso.wanadoo.fr/jm.doudoux/java/tutorial/chap020.htm
StringTokenizer: http://www.developpez.org/club/bkostrzewa/td-chaines/tokenize.html
Gestion des dates: http://java.developpez.com/faq/java/?page=langage_date
Code source de l'exemple:
à venir
//************** PersonneWriter.java
package ecrisfichier;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.PrintWriter;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.StringTokenizer;
public class PersonneWriter {
/*
* Sauver et relire un objet
*/
public static void testAnnuaire() {
Annuaire a = new Annuaire();
a.ajoutePersonne(new Personne(stringToDate("05/06/2006"), "Dupont",
"Jean"));
a.ajoutePersonne(new Personne(stringToDate("01/02/1935"), "Durant",
"Alfred"));
a.ajoutePersonne(new Personne(stringToDate("01/01/1995"), "Dujnou",
"Paul"));
try {
FileOutputStream fichier = new FileOutputStream("annuaire.dat");
ObjectOutputStream out = new ObjectOutputStream(fichier);
out.writeObject(a);
out.close();
System.out.println("annuaire sauvegardé dans le fichier:\n" + a);
} catch (FileNotFoundException e) {
System.out.println("erreur d'ouverture du fichier en écriture");
} catch (IOException e) {
System.out.println("erreur d'écriture du fichier");
}
// relecture de l'annuaire sauvegardé
try {
FileInputStream fichierEnLecture = new FileInputStream("annuaire.dat");
ObjectInputStream in = new ObjectInputStream(fichierEnLecture);
Annuaire b = (Annuaire) in.readObject();
System.out.println("annuaire relu à partir du fichier:\n" + b);
} catch (FileNotFoundException e) {
System.out.println("erreur d'ouverture du fichier en lecture");
} catch (IOException e) {
System.out.println("erreur de lecture du fichier");
} catch (ClassNotFoundException e) {
System.out.println("erreur de type " + e.getMessage());
}
}
/*
* Sauver et relire un objet au format csv reconnu par Excel
*/
public static void testAnnuaireCsv() {
Annuaire a = new Annuaire();
a.ajoutePersonne(new Personne(stringToDate("05/13/2006"), "Dupont",
"Jean"));
a.ajoutePersonne(new Personne(stringToDate("01/02/1935"), "Durant",
"Alfred"));
a.ajoutePersonne(new Personne(stringToDate("01/01/1995"), "Dujnou",
"Paul"));
try {
FileOutputStream fichier = new FileOutputStream("annuaire1.csv");
PrintWriter out = new PrintWriter(fichier);
out.print(a.toCsv());
out.close();
System.out
.println("annuaire sauvegardé au format csv dans le fichier annuaire1.csv:\n"
+ a);
} catch (FileNotFoundException e) {
System.out.println("erreur d'ouverture du fichier en écriture");
}
// ouvrir l'annuaire sauvegardé avec Excel, le modifier,
// et le sauvegarder sous le nom: annuaire3.csv
// relecture de l'annuaire sauvegardé
Annuaire b = new Annuaire();
try {
FileReader fichierEnLecture = new FileReader("annuaire3.csv");
BufferedReader in = new BufferedReader(fichierEnLecture);
String ligne;
while ((ligne = in.readLine()) != null)
b.ajoutePersonne(new Personne(ligne));
System.out
.println("annuaire relu à partir du fichier annuaire3.csv:\n"
+ b);
} catch (FileNotFoundException e) {
System.out.println("erreur d'ouverture du fichier en lecture");
} catch (IOException e) {
System.out.println("erreur de lecture du fichier");
}
}
/*
* Sauver et relire un objet
*/
public static void testPersonne() {
Personne p1 = new Personne(stringToDate("05/06/2006"), "Dupont", "Jean");
// sauvegarde de l'objet
try {
FileOutputStream fichier = new FileOutputStream("person.don");
ObjectOutputStream out = new ObjectOutputStream(fichier);
out.writeObject(p1);
out.close();
System.out.println("objet sauvegardé dans le fichier:" + p1);
} catch (FileNotFoundException e) {
System.out.println("erreur d'ouverture du fichier en écriture");
} catch (IOException e) {
System.out.println("erreur d'écriture du fichier");
}
// relecture de l'objet sauvegardé
try {
FileInputStream fichierEnLecture = new FileInputStream("person.don");
ObjectInputStream in = new ObjectInputStream(fichierEnLecture);
Personne p2 = (Personne) in.readObject();
System.out.println("objet relu à partir du fichier:" + p2);
} catch (FileNotFoundException e) {
System.out.println("erreur d'ouverture du fichier en lecture");
} catch (IOException e) {
System.out.println("erreur de lecture du fichier");
} catch (ClassNotFoundException e) {
System.out.println("erreur de type " + e.getMessage());
}
}
public static void main(String[] args) {
testAnnuaire();
testAnnuaireCsv();
testPersonne();
}
// usage: Date d = stringToDate("05/06/2006");
public static Date stringToDate(String date) {
Date d = null;
SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy");
try {
return df.parse(date);
} catch (ParseException e1) {
System.out.print("erreur de conversion de date pour " + date);
return null;
}
}
}
//************* Personne.java
package ecrisfichier;
import java.io.Serializable;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.StringTokenizer;
public class Personne implements Serializable {
private String nom;
private String prenom;
private Date dateNaissance;
public String toString() {
return nom + " " + prenom + " " + dateToString(dateNaissance);
}
public String toCsv() { // on peut l'ouvrir avec Excel
return nom + ";" + prenom + ";" + dateToString(dateNaissance);
}
//csvLine est au format: Dupont;Jean;05/06/2006
public Personne(String csvLine) {
int compteurmot = 0;
StringTokenizer s = new StringTokenizer(csvLine, ";");
while (s.hasMoreTokens()) {
switch (compteurmot) {
case 0:
nom = s.nextToken();
break;
case 1:
prenom = s.nextToken();
break;
case 2:
dateNaissance = stringToDate(s.nextToken());
break;
}
compteurmot++;
}
}
public Personne(Date naissance, String nom, String prenom) {
dateNaissance = naissance;
this.nom = nom;
this.prenom = prenom;
}
public String dateToString(Date date) {
Date d = null;
SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy");
return df.format(date);
}
// usage: Date d = stringToDate("05/06/2006");
public Date stringToDate(String date) {
Date d = null;
SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy");
try {
return df.parse(date);
} catch (ParseException e1) {
System.out.print("erreur de conversion de date pour " + date);
return null;
}
}
}
//*************** Annuaire.java
package ecrisfichier;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Annuaire implements Serializable {
List personnes = new ArrayList();
public void ajoutePersonne(Personne p) {
personnes.add(p);
}
public String toString() {
String result = "";
Iterator iter = personnes.iterator();
while (iter.hasNext()) {
Personne element = (Personne) iter.next();
result += element + "\n";
}
return result;
}
public String toCsv() { // on peut l'ouvrir avec Excel
String result = "";
Iterator iter = personnes.iterator();
while (iter.hasNext()) {
Personne element = (Personne) iter.next();
result += element.toCsv() + "\n";
}
return result;
}
}
|
-->
Commentaires
Aucun commentaire pour le moment.
Ajouter un commentaire
Les commentaires pour ce billet sont fermés.