La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

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.

Présentations similaires


Présentation au sujet: "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."— Transcription de la présentation:

1 Sérialisation des objets

2 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 sourceprogramme Flot d'entrée cible programme Flot de sortie clavier, fichier, réseau... écran, fichier, réseau, imprimante...

3 La jungle des flots ( 60 classes) Flots binaires Package java.io aussi java.util.zip Information transmise telle quelle octet par octet Flots de texte Information subit une transformation ("formatage") pour passer au format texte de la machine hôte

4 par un flot binaire Exemple : écrire des caractères dans un fichier Flots de texte Flot de sortie programme fichier Car UNICODE sur 2 octets ces 2 octets Car UNICODE sur 2 octets Car code local sur 1 octet cet octet '\n' Car LF UNIX Car CR et LF MS-DOS

5 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

6 Flots binaires utilisés InputStream OutputStream octets DataInputStream DataOutputStream Manipulent des types primitifs + String FileInputStream Permettent d'associer un flot binaire à un fichier FileOutputStream

7 On "branche" donc des flots sur des flots Exemple : écrire dans un fichier DataOuptut Stream programme fichier int, float, char,.. String FileOutput Stream DataOutputStream fs = new DataOuputStream (new FileOuputStream("essai.b"));

8 Flots de texte Reader Writer Manipulent des caractères (UNICODE) abstraites InputStreamReader InputStreamWriter FileReader Permettent d'associer un flot de texte à un fichier FileWriter

9 En pratique on utilise Pour lire : BufferedReaderméthode readLine() Pour écrire : BufferedWriterméthodes write (String) newLine() PrintWriterméthodes print println écrire tous les types primitifs + String Qu'on branche sur des flots de plus bas niveau

10 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?

11 "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 }

12 (2) Répartition des tâches selon la relation de composition Objet o Classe C Objet o1 Classe C1 Objet o2 Classe C2 int i sauver(f) { o1.sauver(f) o2.sauver(f) écrire(i) dans f } Classe C

13 Exemple : application Shogun FrameJeu fenêtre principale PanneauJoueurpanneau de gauche PanneauJeupanneau de droite Jeugère la partie Echiquierdessine la grille EnsPiecesensemble de pièces d'un joueur Piecece qui est commun à toutes les pièces PieceElempièce "normale" PieceShogunpièce shogun Les classes Sauver une partie en cours ? = sauver jeu

14 Graphe de décomposition d'un objet pjeu PanneauJeu jeu Jeu aquiLeTour enspieces EnsPieces[] ensPieces[O] ensPieces[1] EnsPieces vPieces Vector joueur T Object[] PieceShogun PieceElem

15 Sérialisation "automatique" public final void writeObject(Object obj) throws IOExceptionObjectIOException Classe java.io.ObjectOutputStream public final Object readObject() throws OptionalDataException, ClassNotFoundException, IOExceptionObjectOptionalDataException ClassNotFoundExceptionIOException Classe java.io.ObjectInputStream Ces classes permettent aussi de manipuler des types primitifs

16 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)

17 jeu Jeu aquiLeTour enspieces EnsPieces[] ensPieces[O] ensPieces[1] EnsPieces vPieces Vector joueur T Object[] PieceShogun PieceElem Piece Jeu, EnsPieces et Piece doivent implémenter l'interface Serializable

18 Le graphe peut être plus complexe qu'un arborescence

19

20 Le menu est géré par des attributs de la fenêtre (objet de la classe FrameJeu) JMenuBar JMenu JMenuItemsauver restaurer

21 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);

22 public void sauve (String nomFic) throws IOException { ObjectOutputStream flotS = new ObjectOutputStream (new FileOutputStream (nomFic)); flotS.writeObject(this); flotS.close(); } L'objet jeu Jeu

23 Dans FrameJeu - dans constructeur de FrameJeu : JMenuItem mSauve = new JMenuItem("Sauver"); mRestaure.addActionListener (new ActionListener() { public void actionPerformed (ActionEvent e) { mSauveAction(e);} });

24 - Ailleurs dans FrameJeu : public void mSauveAction(ActionEvent evt) { … pjeu.jeu.sauve(nomFic); … } Problème : throws IOException

25 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)

26 public void mSauveAction(ActionEvent evt) { … try { pjeu.jeu.sauve(nomFic);} catch (IOException e) { // message sur fenêtre console par ex. // afficher aussi e.getMessage() } }

27 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 faut créer => Une méthode statique dans Jeu qui crée un jeu pjeu.jeu = Jeu.restaure(nomFic);

28 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

29 mRestaure.addActionListener (new ActionListener() { public void actionPerformed(ActionEvent e) { mRestaureAction(e);} }); Constructeur de FrameJeu

30 public void mRestaureAction(ActionEvent evt) { … try {pjeu.jeu = Jeu.restaure(nomFic);} catch (Exception e) {….} } FrameJeu

31 Sérialisation : la conclusion Avantages Automatique Peut gérer des objets complexes Inconvénient Flots binaires : fichiers pas lisibles


Télécharger ppt "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."

Présentations similaires


Annonces Google