c’est quoi ?
C’est un mécanisme d’écriture de l’état d’un objet dans un flux d’octets. Personnallement, je l’utilise pour les EJB, RMI, JMS, Socket et Hibernate ainsi que pour sauvegarder des objets dans un fichier et pouvoir les récupérer comme objets et non comme de simples données textuelles.
Principe :
L’exemple ci-dessous est tiré du cours detaillé I/O - Fichier - Sérialisation
package enregistrerDesObjetsChats; import java.io.Serializable; /** * Projet : TP-exemple * Classe : Chat.java * @author : Philippe Bouget * Date : 03/10/2019 */ public class Chat implements Serializable { private String petitNom; private int age; public Chat(String petitNom, int age) { this.petitNom=petitNom; this.age=age; } /** * @return le petitNom */ public String getPetitNom() { return petitNom; } /** * @param petitNom le petitNom à initialiser */ public void setPetitNom(String petitNom) { this.petitNom = petitNom; } /** * @return le age */ public int getAge() { return age; } /** * @param age le age à initialiser */ public void setAge(int age) { this.age = age; } public String toString() { return "Chat : :"+petitNom+" "+age+" ans"; } public void afficher() { System.out.println("Chat : :"+petitNom+" "+age+" ans"); } }
Comme vous pouvez le constater dans la déclaration de la classe Chat, on implémente l’interface Serializable de la manière suivante :
public class Chat implements Serializable
Cela suffit pour rendre l’écriture, la transmission via un réseau et la lecture d’objets possible.
Exemple d’écriture des objets :
package enregistrerDesObjetsChats; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectOutputStream; /**============================================ Ecriture d'objet dans un Fichier texte Gestion des flux entrée / sortie Auteur : Philippe Bouget Nom Programme : EcrireObjet.java ============================================== */ public class EcrireObjet { public static void main (String args[]) { // on créer des objets de type Chat Chat minou = new Chat("Youpi",3); Chat poupou = new Chat("Poupou",4); Chat propret = new Chat("Propret",7); Chat pounette = new Chat("Pounette",8); try { FileOutputStream fichierDObjets = new FileOutputStream("ChatObj.txt"); ObjectOutputStream fluxDObjets = new ObjectOutputStream(fichierDObjets); minou.afficher(); fluxDObjets.writeObject(minou); poupou.afficher(); fluxDObjets.writeObject(poupou); propret.afficher(); fluxDObjets.writeObject(propret); pounette.afficher(); fluxDObjets.writeObject(pounette); // on vide le tampon fluxDObjets.flush(); // on ferme la fichier fluxDObjets.close(); fichierDObjets.close(); System.out.println("Fin de la copie du fichier"); } catch (IOException e) {e.getMessage();} } }
Pour l’écriture des objets on déclare un objet du type ObjectOutputStream qui nous permet de faire appel à la méthode writeObject() pour sauvegarder un objet. Il faut bien entendu effectuer un flush() puis un close() du flux en sortie.
Exemple de lecture des objets depuis un fichier :
package enregistrerDesObjetsChats; /**============================================ Lecture d'objet dans un Fichier texte Gestion des flux entrée / sortie Auteur : Philippe Bouget Année : 2019 Nom Programme : LireObjet.java ============================================== */ import java.io.FileInputStream; import java.io.IOException; import java.io.ObjectInputStream; public class LireObjet { public static void main (String args[]) { try { FileInputStream fichierDObjets = new FileInputStream("ChatObj.txt"); ObjectInputStream fluxDObjets = new ObjectInputStream(fichierDObjets); while(true) // tant qu'il y a des objets { Object o = fluxDObjets.readObject(); if (o instanceof Chat) { ((Chat)o).afficher(); } else { System.out.println("Objet Non Identifié !"); } } } catch (ClassNotFoundException e) {e.getMessage();} catch (IOException e) {e.getMessage();} System.out.println("Fin de la lecture"); } }
Pour la lecture des objets on déclare un objet du type ObjectInputStream qui nous permet de faire appel à la méthode readObject() pour sauvegarder un objet.