31
Sérialisation des objets

Sérialisation des objets. Qu'est-ce qu'un flot? flux stream Un objet capable de transférer une suite d'octets soit d'une source externe vers le programme

Embed Size (px)

Citation preview

Page 1: Sérialisation des objets. Qu'est-ce qu'un flot? flux stream Un objet capable de transférer une suite d'octets soit d'une source externe vers le programme

Sérialisation des objets

Page 2: Sérialisation des objets. Qu'est-ce qu'un flot? flux stream Un objet capable de transférer une suite d'octets soit d'une source externe vers le programme

Qu'est-ce qu'un flot? flux

stream

Un objet capable de transférer une suite d'octets

• soit d'une source externe vers le programme

• soit du programme vers une cible externe

source programme

Flot d'entrée

cible programme

Flot de sortie

clavier,fichier,réseau ...

écran,fichier,réseau,imprimante ...

Page 3: Sérialisation des objets. Qu'est-ce qu'un flot? flux stream Un objet capable de transférer une suite d'octets soit d'une source externe vers le programme

La jungle des flots ( 60 classes)

• Flots binaires

Package java.io aussi java.util.zip

Information transmise telle quelleoctet par octet

• Flots de texte

Information subit une transformation("formatage") pour passer au formattexte de la machine hôte

Page 4: Sérialisation des objets. Qu'est-ce qu'un flot? flux stream Un objet capable de transférer une suite d'octets soit d'une source externe vers le programme

• par un flot binaire

Exemple : écrire des caractères dans un fichier

• Flots de texte

Flot de sortie

programme fichier

Car UNICODEsur 2 octets

ces 2 octets

Car UNICODEsur 2 octets

Car code localsur 1 octet

cet octet

'\n' Car LF UNIXCar CR et LF MS-DOS

Page 5: Sérialisation des objets. Qu'est-ce qu'un flot? flux stream Un objet capable de transférer une suite d'octets soit d'une source externe vers le programme

Flots binaires

InputStream OutputStream

Manipulent des octets ou tableaux d'octets

Attention, entêtes des méthodes trompeuses

public abstract int read() throws IOException

1 octet stocké dans un int (0..255) ou -1

Page 6: Sérialisation des objets. Qu'est-ce qu'un flot? flux stream Un objet capable de transférer une suite d'octets soit d'une source externe vers le programme

Flots binaires utilisés

InputStream OutputStream octets

DataInputStream DataOutputStream

Manipulent des types primitifs + String

FileInputStream

Permettent d'associer un flot binaire à un fichier

FileOutputStream

Page 7: Sérialisation des objets. Qu'est-ce qu'un flot? flux stream Un objet capable de transférer une suite d'octets soit d'une source externe vers le programme

On "branche" donc des flots sur des flots

Exemple : écrire dans un fichier

DataOuptutStream

programme fichier

int,float,char,.. String

FileOutputStream

DataOutputStream fs = new DataOuputStream(new FileOuputStream("essai.b"));

Page 8: Sérialisation des objets. Qu'est-ce qu'un flot? flux stream Un objet capable de transférer une suite d'octets soit d'une source externe vers le programme

Flots de texte

Reader Writer

Manipulent des caractères (UNICODE)

abstraites

InputStreamReader InputStreamWriter

FileReader

Permettent d'associer un flot de texte à un fichier

FileWriter

Page 9: Sérialisation des objets. Qu'est-ce qu'un flot? flux stream Un objet capable de transférer une suite d'octets soit d'une source externe vers le programme

En pratique on utilise

Pour lire :

BufferedReader méthode readLine()

Pour écrire :

BufferedWriter méthodes write (String) newLine()

PrintWriter méthodes print println

écrire tous les typesprimitifs + String

Qu'on branche sur des flots de plus bas niveau

Page 10: Sérialisation des objets. Qu'est-ce qu'un flot? flux stream Un objet capable de transférer une suite d'octets soit d'une source externe vers le programme

Et les objets?

Les flots vus auparavant permettent de manipuler des :

valeurs de type primitif

tableaux de caractères

chaînes de caractères (String)

Les Objets? Il faut les décomposer.

Comment?

Page 11: Sérialisation des objets. Qu'est-ce qu'un flot? flux stream Un objet capable de transférer une suite d'octets soit d'une source externe vers le programme

"Chaque classe s'occupe des attributs qu'elle définit"

(1) Répartition des tâches selon la relation d'héritage

A

B

a

b

sauver(f){écrire a dans f}

sauver(f){ super.sauver(f) écrire b dans f }

Page 12: Sérialisation des objets. Qu'est-ce qu'un flot? flux stream Un objet capable de transférer une suite d'octets soit d'une source externe vers le programme

(2) Répartition des tâches selon la relation de composition

Objet oClasse C

Objet o1Classe C1

Objet o2Classe C2

int i

sauver(f){ o1.sauver(f) o2.sauver(f) écrire(i) dans f }

Classe C

Page 13: Sérialisation des objets. Qu'est-ce qu'un flot? flux stream Un objet capable de transférer une suite d'octets soit d'une source externe vers le programme

Exemple : application Shogun

FrameJeu fenêtre principalePanneauJoueur panneau de gauchePanneauJeu panneau de droiteJeu gère la partieEchiquier dessine la grilleEnsPieces ensemble de pièces d'un joueurPiece ce qui est commun

à toutes les piècesPieceElem pièce "normale"PieceShogun pièce shogun

Les classes

Sauver une partie en cours ? = sauver jeu

Page 14: Sérialisation des objets. Qu'est-ce qu'un flot? flux stream Un objet capable de transférer une suite d'octets soit d'une source externe vers le programme

Graphe de décomposition d'un objet

pjeuPanneauJeu

jeuJeu

aquiLeTour

enspiecesEnsPieces[]

ensPieces[O] ensPieces[1]

EnsPieces EnsPieces

vPiecesVector

joueur

TObject[]

PieceShogun

PieceElem

Page 15: Sérialisation des objets. Qu'est-ce qu'un flot? flux stream Un objet capable de transférer une suite d'octets soit d'une source externe vers le programme

Sérialisation "automatique"

public final void writeObject(Object obj)

throws IOException

Classe java.io.ObjectOutputStream

public final Object readObject() throws OptionalDataException, ClassNotFoundException, IOException

Classe java.io.ObjectInputStream

Ces classes permettent aussi de manipuler des types primitifs

Page 16: Sérialisation des objets. Qu'est-ce qu'un flot? flux stream Un objet capable de transférer une suite d'octets soit d'une source externe vers le programme

• Ces méthodes ne s'appliquent qu'à des objets

sérialisables

= dont la classe implémente l'interface

Java.io.Serializable (interface "marqueur")

• Cette propriété s'hérite

• Si on prend le graphe de l'objet : tous les objets du

graphe doivent être sérialisables

(sinon NotSerializableException)

Page 17: Sérialisation des objets. Qu'est-ce qu'un flot? flux stream Un objet capable de transférer une suite d'octets soit d'une source externe vers le programme

jeuJeu

aquiLeTour

enspiecesEnsPieces[]

ensPieces[O] ensPieces[1]

EnsPieces EnsPiecesvPiecesVector

joueur

TObject[]

PieceShogun

PieceElem

Piece

Jeu, EnsPieces et Piece doivent implémenterl'interface Serializable

Page 18: Sérialisation des objets. Qu'est-ce qu'un flot? flux stream Un objet capable de transférer une suite d'octets soit d'une source externe vers le programme

Le graphe peut être plus complexequ'un arborescence

Page 19: Sérialisation des objets. Qu'est-ce qu'un flot? flux stream Un objet capable de transférer une suite d'octets soit d'une source externe vers le programme
Page 20: Sérialisation des objets. Qu'est-ce qu'un flot? flux stream Un objet capable de transférer une suite d'octets soit d'une source externe vers le programme

Le menu est géré par des attributs de la fenêtre (objet de la classe FrameJeu)

JMenuBarJMenuJMenuItem sauver

restaurer

Page 21: Sérialisation des objets. Qu'est-ce qu'un flot? flux stream Un objet capable de transférer une suite d'octets soit d'une source externe vers le programme

Action associée à sauver :

- choix d'un nom de fichier nomFic (utiliser FileDialog)

- demander à jeu de se sauvegarder dans le fichier nomFic

pjeu.jeu.sauve(nomFic);

Page 22: Sérialisation des objets. Qu'est-ce qu'un flot? flux stream Un objet capable de transférer une suite d'octets soit d'une source externe vers le programme

public void sauve (String nomFic) throws IOException

{

ObjectOutputStream flotS = new ObjectOutputStream

(new FileOutputStream (nomFic));

flotS.writeObject(this);

flotS.close();

}

L'objet jeu

Jeu

Page 23: Sérialisation des objets. Qu'est-ce qu'un flot? flux stream Un objet capable de transférer une suite d'octets soit d'une source externe vers le programme

Dans FrameJeu

- dans constructeur de FrameJeu :

JMenuItem mSauve = new JMenuItem("Sauver");

mRestaure.addActionListener (new ActionListener() { public void actionPerformed (ActionEvent e)

{ mSauveAction(e);}

});

Page 24: Sérialisation des objets. Qu'est-ce qu'un flot? flux stream Un objet capable de transférer une suite d'octets soit d'une source externe vers le programme

- Ailleurs dans FrameJeu :

public void mSauveAction(ActionEvent evt)

{

pjeu.jeu.sauve(nomFic);

} Problème : throws IOException

Page 25: Sérialisation des objets. Qu'est-ce qu'un flot? flux stream Un objet capable de transférer une suite d'octets soit d'une source externe vers le programme

On n'a pas le droit de faire remonter les exceptionsà actionPerformed (cf. interface ActionListener)

mSauve.addActionListener(new ActionListener(){

public void actionPerformed(ActionEvent e) throws IOException

{ mSauveAction(e);}

});

Donc obligé de capturer les exceptions avant

(dans mSauveAction par exemple)

Page 26: Sérialisation des objets. Qu'est-ce qu'un flot? flux stream Un objet capable de transférer une suite d'octets soit d'une source externe vers le programme

public void mSauveAction(ActionEvent evt)

{

try

{ pjeu.jeu.sauve(nomFic);}

catch (IOException e){ // message sur fenêtre console par ex. // afficher aussi e.getMessage()}

}

Page 27: Sérialisation des objets. Qu'est-ce qu'un flot? flux stream Un objet capable de transférer une suite d'octets soit d'une source externe vers le programme

Action associée à restaurer :

- choix d'un nom de fichier nomFic (utiliser FileDialog)

- demander à jeu de se restaurer depuis le fichier nomFic

Problème : c'est justement l'objet jeu qu'il fautcréer

=> Une méthode statique dans Jeu qui crée un jeu

pjeu.jeu = Jeu.restaure(nomFic);

Page 28: Sérialisation des objets. Qu'est-ce qu'un flot? flux stream Un objet capable de transférer une suite d'octets soit d'une source externe vers le programme

public static Jeu restaure(String nomFic) throws IOException,

ClassNotFoundException

{ ObjectInputStream flotE = new ObjectInputStream (new FileInputStream (nomFic));

Object o = flotE.readObject();

Jeu j = (Jeu) o;

return j;

}

Jeu

Page 29: Sérialisation des objets. Qu'est-ce qu'un flot? flux stream Un objet capable de transférer une suite d'octets soit d'une source externe vers le programme

mRestaure.addActionListener (new ActionListener()

{ public void actionPerformed(ActionEvent e)

{ mRestaureAction(e);}

});

Constructeur de FrameJeu

Page 30: Sérialisation des objets. Qu'est-ce qu'un flot? flux stream Un objet capable de transférer une suite d'octets soit d'une source externe vers le programme

public void mRestaureAction(ActionEvent evt)

{ …

try

{pjeu.jeu = Jeu.restaure(nomFic);}

catch (Exception e)

{….}

}

FrameJeu

Page 31: Sérialisation des objets. Qu'est-ce qu'un flot? flux stream Un objet capable de transférer une suite d'octets soit d'une source externe vers le programme

Sérialisation : la conclusion

Avantages

• Automatique

• Peut gérer des objets complexes

Inconvénient

Flots binaires : fichiers pas lisibles