Sérialisation en Java

La sérialisation en Java est un mécanisme qui convertit l'état d'un objet en un flux d'octets. La désérialisation est son processus inverse. Grâce à la désérialisation, à partir d'un flux d'octets, un objet Java réel est créé dans la mémoire. Un tel mécanisme persiste l'objet.

Le flux d'octets ainsi créé à partir de la sérialisation ne dépend d'aucune plateforme. L'objet sérialisé sur une plateforme peut être désérialisé sur n'importe quelle autre plateforme sans aucun problème. Ainsi, l'ensemble du processus de sérialisation et de désérialisation est indépendant de la JVM.

Si un objet de classe doit être sérialisé, alors il faut implémenter l'interface java.io.Serializable. Sérialisable en java est une interface de marqueur. Il n'a ni champs ni méthodes à implémenter. Une classe est rendue sérialisable par ce processus qui ressemble à un processus Opt-In.

La sérialisation en Java est implémentée par les deux classes ObjectInputStream et ObjectOutputStream.

Tout ce qui est requis est un wrapper sur eux afin qu'il puisse être enregistré dans un fichier ou envoyé sur un réseau.

Le concept de sérialisation en Java

La classe ObjectOutputStream qui est une classe de sérialisation comme mentionné dans la section ci-dessus contient plusieurs méthodes d'écriture pour écrire différents types de données, mais une méthode est la plus populaire

public final void writeObject(Object x) throws IOException

La méthode ci-dessus peut être utilisée pour sérialiser un objet. Cette méthode l'envoie également au flux de sortie. De la même manière, la classe ObjectInputStream contient la méthode de désérialisation des objets

public final Object readObject() throws IOException, ClassNotFoundException

La méthode de désérialisation récupère l'objet d'un flux et désérialise le même. La valeur de retour est à nouveau un objet, il suffit donc de le convertir en type de données pertinent.

Pour qu'une classe soit sérialisée avec succès, deux conditions doivent être remplies -

  • io. L'interface sérialisable doit être implémentée par la classe.
  • Tous les champs de la classe doivent être sérialisables. Si même un champ n'est pas sérialisable, il doit être marqué comme transitoire.

Si quelqu'un a besoin de vérifier si une classe est sérialisable ou non, la solution simple est de vérifier si la classe implémente la méthode java.io.Serializable, si c'est le cas, elle est sérialisable sinon, ce n'est pas le cas.

Il convient de noter que lors de la sérialisation d'un objet dans un fichier, la pratique standard consiste à donner au fichier une extension .ser.

Méthode de sérialisation en Java

Si ces méthodes sont présentes dans la classe, elles sont utilisées pour la sérialisation à des fins Java.

Méthode La description
public final void writeObject (Object obj) lève IOException ()Cela écrira l'objet spécifié dans ObjectOutputStream.
public void flush () lève IOException ()Cela videra le flux de sortie actuel.
public void close () lève IOException ()Cela fermera le flux de sortie actuel.

Méthode de désérialisation en Java

Méthode La description
public final Object readObject () lève IOException, ClassNotFoundException ()Cela lira un objet du flux d'entrée.
public void close () lève IOException ()Cela fermera ObjectInputStream.

Exemples de sérialisation en Java

Dans cette section, nous avons discuté de la sérialisation en Java avec des exemples.

Un exemple en Java est fourni ici pour montrer comment fonctionne la sérialisation en Java. Nous créons une classe Employé pour étudier certaines fonctionnalités et le code correspondant est fourni ci-dessous. Cette classe d'employés implémente l'interface Serializable.

public class Employee implements java.io.Serializable (
public String name;
public String address;
public transient int SSN;
public int number;
public void mailCheck() (
System.out.println("Mailing a letter to " + name + " " + address);
)
)

Lorsque ce programme aura terminé son exécution, un fichier nommé employee.ser sera créé. Ce programme ne fournit pas de sortie garantie, il est plutôt à des fins explicatives uniquement et l'objectif est de comprendre son utilisation et son fonctionnement.

import java.io.*;
public class SerializeDemo (
public static void main(String () args) (
Employee e = new Employee();
e.name = "Rahul Jain";
e.address = "epip, Bangalore";
e.SSN = 114433;
e.number = 131;
try (
FileOutputStream fileOut =
new FileOutputStream("/tmp/employee.ser");
ObjectOutputStream out = new ObjectOutputStream(fileOut);
out.writeObject(e);
out.close();
fileOut.close();
System.out.printf("Serialized data saved in /tmp/employee.ser");
) catch (IOException i) (
i.printStackTrace();
)
)
)

Le programme DeserializeDemo décrit ci-dessous désérialise l'objet Employee ci-dessus créé dans le programme Serialize Demo .

import java.io.*;
public class DeserializeDemo (
public static void main(String () args) (
Employee e = null;
try (
FileInputStream fileIn = new FileInputStream("/tmp/employee.ser");
ObjectInputStream in = new ObjectInputStream(fileIn);
e = (Employee) in.readObject();
in.close();
fileIn.close();
) catch (IOException i) (
i.printStackTrace();
return;
) catch (ClassNotFoundException c) (
System.out.println("Employee class is not found");
c.printStackTrace();
return;
)
System.out.println("Deserialized Employee…");
System.out.println("Name: " + e.name);
System.out.println("Address: " + e.address);
System.out.println("SSN: " + e.SSN);
System.out.println("Number: " + e.number);
)
)

Le code ci-dessus produira le résultat suivant -

Production

Employé désérialisé…

Nom: Rahul Jain

Adresse: epip, Bangalore

SSN: 0

Numéro: 131

Certains points importants liés au programme ci-dessus sont fournis ci-dessous -

  • Le bloc try / catch ci-dessus tente d'attraper une exception ClassNotFoundException. Ceci est déclaré par la méthode readObject ().
  • Une JVM ne peut désérialiser un objet que si elle trouve le bytecode de la classe.
  • Si la JVM ne trouve pas de classe pendant la désérialisation, elle lèvera ClassNotFoundException.
  • la valeur de retour de readObject () est toujours convertie en référence Employee.
  • La valeur du champ SSN était initialement de 114433 lorsque l'objet a été sérialisé, mais cette valeur n'a pas été envoyée au flux de sortie. Pour la même raison, l'objet de champ Employee SSN désérialisé est 0.

Conclusion

Ci-dessus, nous avons présenté les concepts de sérialisation et fourni des exemples. Comprenons le besoin de sérialisation en guise de conclusion.

  • Communication: si deux machines qui exécutent le même code doivent communiquer, la solution la plus simple est qu'une machine doit créer un objet contenant des informations qu'elle transmettra, puis sérialiser cet objet avant de l'envoyer à l'autre machine. Pas une excellente méthode, mais fait le travail.
  • Persistance: si l'état de fonctionnement doit être stocké dans une base de données, il est d'abord sérialisé en un tableau d'octets, puis stocké dans la base de données pour être récupéré ultérieurement.
  • Copie approfondie: si une réplique exacte d'un objet doit être créée et que l'écriture d'une classe de clonage spécialisée est trop difficile, alors uniquement en sérialisant l'objet puis en le désérialisant vers un autre objet atteindra l'objectif.
  • Synchronisation JVM croisée: différentes JVM fonctionnant sur différentes machines et architectures peuvent être synchronisées.

Articles recommandés

Cela a été un guide pour la sérialisation en Java. Ici, nous avons discuté des différentes méthodes de sérialisation en Java avec des exemples. Vous pouvez également consulter l'article suivant pour en savoir plus -

  1. Questions d'entretiens pour le poste de Java Developer
  2. Liste Java vs liste de tableaux
  3. Utilisations de JavaScript