logo

Sérialisation et désérialisation en Java

  1. Sérialisation
  2. Interface sérialisable
  3. Exemple de sérialisation
  4. Exemple de désérialisation
  5. Sérialisation avec héritage
  6. Interface externalisable
  7. Sérialisation et membre de données statiques

Sérialisation en Java est un mécanisme de écrire l'état d'un objet dans un flux d'octets . Il est principalement utilisé dans les technologies Hibernate, RMI, JPA, EJB et JMS.

L'opération inverse de la sérialisation est appelée désérialisation où le flux d'octets est converti en objet. Le processus de sérialisation et de désérialisation est indépendant de la plate-forme, cela signifie que vous pouvez sérialiser un objet sur une plate-forme et le désérialiser sur une autre plate-forme.

Pour sérialiser l'objet, nous appelons le writeObject() méthode de ObjetOutputStream classe, et pour la désérialisation, nous appelons la readObject() méthode de ObjetInputStream classe.

Nous devons mettre en œuvre le Sérialisable interface pour sérialiser l’objet.

Avantages de la sérialisation Java

Il est principalement utilisé pour parcourir l'état des objets sur le réseau (c'est ce qu'on appelle le marshalling).

barre d'outils d'accès rapide aux mots
sérialisation Java

interface java.io.sérialisable

Sérialisable est une interface de marqueur (n'a pas de données membres ni de méthode). Il est utilisé pour « marquer » les classes Java afin que les objets de ces classes puissent acquérir une certaine capacité. Le Clonable et Télécommande sont également des interfaces de marqueurs.

Le Sérialisable L'interface doit être implémentée par la classe dont l'objet doit être conservé.

La classe String et toutes les classes wrapper implémentent le java.io.Sérialisable interface par défaut.

Voyons l'exemple donné ci-dessous :

Étudiant.java

 import java.io.Serializable; public class Student implements Serializable{ int id; String name; public Student(int id, String name) { this.id = id; this.name = name; } } 

Dans l'exemple ci-dessus, Étudiant la classe implémente l’interface sérialisable. Ses objets peuvent désormais être convertis en flux. L’implémentation de la classe principale de est présentée dans le code suivant.

Classe ObjectOutputStream

La classe ObjectOutputStream est utilisée pour écrire des types de données primitifs et des objets Java dans un OutputStream. Seuls les objets prenant en charge l'interface java.io.Serializing peuvent être écrits dans des flux.

Constructeur

1) public ObjectOutputStream (OutputStream out) lance IOException {}Il crée un ObjectOutputStream qui écrit dans le OutputStream spécifié.

Méthodes importantes

MéthodeDescription
1) public final void writeObject (Object obj) lance IOException {}Il écrit l'objet spécifié dans ObjectOutputStream.
2) public void flush() lance IOException {}Il vide le flux de sortie actuel.
3) public void close() lance IOException {}Il ferme le flux de sortie actuel.

Classe ObjectInputStream

Un ObjectInputStream désérialise les objets et les données primitives écrites à l'aide d'un ObjectOutputStream.

Constructeur

1) public ObjectInputStream (InputStream in) lance IOException {}Il crée un ObjectInputStream qui lit à partir du InputStream spécifié.

Méthodes importantes

classe abstraite en Java
MéthodeDescription
1) l'objet final public readObject() lève IOException, ClassNotFoundException{}Il lit un objet dans le flux d'entrée.
2) public void close() lance IOException {}Il ferme ObjectInputStream.

Exemple de sérialisation Java

Dans cet exemple, nous allons sérialiser l'objet de Étudiant classe du code ci-dessus. La méthode writeObject() de la classe ObjectOutputStream fournit la fonctionnalité permettant de sérialiser l'objet. Nous sauvegardons l'état de l'objet dans le fichier nommé f.txt.

Persist.java

 import java.io.*; class Persist{ public static void main(String args[]){ try{ //Creating the object Student s1 =new Student(211,'ravi'); //Creating stream and writing the object FileOutputStream fout=new FileOutputStream('f.txt'); ObjectOutputStream out=new ObjectOutputStream(fout); out.writeObject(s1); out.flush(); //closing the stream out.close(); System.out.println('success'); }catch(Exception e){System.out.println(e);} } } 

Sortir:

 success 
téléchargez cet exemple de sérialisation

Exemple de désérialisation Java

La désérialisation est le processus de reconstruction de l'objet à partir de l'état sérialisé. C'est l'opération inverse de la sérialisation. Voyons un exemple où nous lisons les données d'un objet désérialisé.

La désérialisation est le processus de reconstruction de l'objet à partir de l'état sérialisé. C'est l'opération inverse de la sérialisation. Voyons un exemple où nous lisons les données d'un objet désérialisé.

Dépersist.java

 import java.io.*; class Depersist{ public static void main(String args[]){ try{ //Creating stream to read the object ObjectInputStream in=new ObjectInputStream(new FileInputStream('f.txt')); Student s=(Student)in.readObject(); //printing the data of the serialized object System.out.println(s.id+' '+s.name); //closing the stream in.close(); }catch(Exception e){System.out.println(e);} } } 

Sortir:

211 ravi 
téléchargez cet exemple de désérialisation

Sérialisation Java avec héritage (relation IS-A)

Si une classe implémente Interface sérialisable alors toutes ses sous-classes seront également sérialisables. Voyons l'exemple donné ci-dessous :

logique de transfert de registre

SérialiserISA.java

 import java.io.Serializable; class Person implements Serializable{ int id; String name; Person(int id, String name) { this.id = id; this.name = name; } } class Student extends Person{ String course; int fee; public Student(int id, String name, String course, int fee) { super(id,name); this.course=course; this.fee=fee; } } public class SerializeISA { public static void main(String args[]) { try{ //Creating the object Student s1 =new Student(211,'ravi','Engineering',50000); //Creating stream and writing the object FileOutputStream fout=new FileOutputStream('f.txt'); ObjectOutputStream out=new ObjectOutputStream(fout); out.writeObject(s1); out.flush(); //closing the stream out.close(); System.out.println('success'); }catch(Exception e){System.out.println(e);} try{ //Creating stream to read the object ObjectInputStream in=new ObjectInputStream(new FileInputStream('f.txt')); Student s=(Student)in.readObject(); //printing the data of the serialized object System.out.println(s.id+' '+s.name+' '+s.course+' '+s.fee); //closing the stream in.close(); }catch(Exception e){System.out.println(e);} } } 

Sortir:

 success 211 ravi Engineering 50000 

La classe SerializeISA a sérialisé l'objet de classe Student qui étend la classe Person qui est sérialisable. Les propriétés de la classe parent sont héritées des sous-classes, donc si la classe parent est sérialisable, la sous-classe le sera également.

Sérialisation Java avec agrégation (relation HAS-A)

Si une classe a une référence à une autre classe, toutes les références doivent être sérialisables, sinon le processus de sérialisation ne sera pas effectué. Dans ce cas, NotSerializingException est lancé au moment de l'exécution.

Adresse.java

 class Address{ String addressLine,city,state; public Address(String addressLine, String city, String state) { this.addressLine=addressLine; this.city=city; this.state=state; } } 

Étudiant.java

 import java.io.Serializable; public class Student implements Serializable{ int id; String name; Address address;//HAS-A public Student(int id, String name) { this.id = id; this.name = name; } } 

Puisque Address n’est pas sérialisable, vous ne pouvez pas sérialiser l’instance de la classe Student.

Remarque : Tous les objets d'un objet doivent être sérialisables.

Sérialisation Java avec le membre de données statique

S'il y a des données membres statiques dans une classe, elles ne seront pas sérialisées car statique est la partie de la classe et non l'objet.

Employé.java

 class Employee implements Serializable{ int id; String name; static String company='SSS IT Pvt Ltd';//it won't be serialized public Student(int id, String name) { this.id = id; this.name = name; } } 

Sérialisation Java avec tableau ou collection

Règle : En cas de tableau ou de collection, tous les objets du tableau ou de la collection doivent être sérialisables. Si un objet n'est pas sérialisable, la sérialisation échouera.

Externalisable en Java

L'interface Externalisable offre la possibilité d'écrire l'état d'un objet dans un flux d'octets au format compressé. Ce n'est pas une interface de marqueur.

L'interface Externalisable propose deux méthodes :

    public void writeExternal (ObjectOutput out) lance IOException public void readExternal (ObjectInput in) lance IOException

Mot-clé transitoire Java

Si vous ne souhaitez sérialiser aucune donnée membre d’une classe, vous pouvez la marquer comme transitoire.

Employé.java

 class Employee implements Serializable{ transient int id; String name; public Student(int id, String name) { this.id = id; this.name = name; } } 

Désormais, l'identifiant ne sera pas sérialisé, donc lorsque vous désérialiserez l'objet après la sérialisation, vous n'obtiendrez pas la valeur de l'identifiant. Il renverra toujours la valeur par défaut. Dans ce cas, il renverra 0 car le type de données id est un entier.

Visitez la page suivante pour plus de détails.

SerialVersionUID

Le processus de sérialisation au moment de l'exécution associe un identifiant à chaque classe Serialisable, appelé SerialVersionUID. Il est utilisé pour vérifier l'expéditeur et le destinataire de l'objet sérialisé. L'expéditeur et le destinataire doivent être identiques. Pour le vérifier, SerialVersionUID est utilisé. L'expéditeur et le destinataire doivent avoir le même SerialVersionUID, sinon, Exception de classe invalide sera lancé lorsque vous désérialiserez l'objet. Nous pouvons également déclarer notre propre SerialVersionUID dans la classe Serialisable. Pour ce faire, vous devez créer un champ SerialVersionUID et lui attribuer une valeur. Il doit être du type long avec statique et final. Il est suggéré de déclarer explicitement le champ SerialVersionUID dans la classe et de le rendre également privé. Par exemple:

vérification nulle en Java
 private static final long serialVersionUID=1L; 

Maintenant, la classe Serialisable ressemblera à ceci :

Employé.java

 import java.io.Serializable; class Employee implements Serializable{ private static final long serialVersionUID=1L; int id; String name; public Student(int id, String name) { this.id = id; this.name = name; } }