Quel est le concept de sérialisation en Java?

Cet article vous aidera avec une approche globale du concept de sérialisation en Java avec des exemples en temps réel pour une meilleure compréhension.

Sérialisation en est un concept important qui traite de la conversion d'objets en un flux d'octets pour transporter les objets java d'une machine virtuelle Java à l'autre et les recréer dans leur forme d'origine. Je vais aligner le dossier de cet article comme ci-dessous:



Qu'est-ce que la sérialisation en Java?

Sérialisation en Java est le processus de conversion du code Java Objet dans une Byte Stream , pour transférer le code objet d'une machine virtuelle Java à une autre et le recréer en utilisant le processus de Désérialisation.



Serialization-in-Java-Edureka-Picture-1

Pourquoi avons-nous besoin de la sérialisation à Java ?

Nous avons besoin de la sérialisation pour les raisons suivantes:



  • la communication : La sérialisation implique la procédure d'objet sérialisation et transmission. Cela permet à plusieurs systèmes informatiques de concevoir, partager et exécuter des objets simultanément.

  • Mise en cache : Le temps consacré à la construction d'un objet est plus élevé que le temps nécessaire à sa désérialisation. La sérialisation minimise la consommation de temps en mise en cache les objets géants.

  • Copie profonde : Clonage processus est simplifié grâce à la sérialisation. Un exact réplique d'un objet est obtenu parsérialiser l'objet en un tableau d'octets , puis en le désérialisant.



  • Traverser Synchronisation JVM: Le principal avantage de la sérialisation est qu'ellefonctionne sur différentes machines virtuelles Java pouvant être exécutées sur différents architectures ou Systèmes d'exploitation

  • Persistance: L'état de tout objet peut être directement stocké en lui appliquant la sérialisation et stocké dans un base de données pour que ça puisse être récupéré plus tard.

Comment sérialiser un objet?

À Objet Java est sérialisable si et seulement si sa classe ou l'une de ses classes parentes implémentent soit le Java . je . Sérialisable interface ou sa sous-interface, java.io.Externalizable.

Dans le processus de sérialisation, nous convertissons l'état d'un objet en un flux d'octets afin qu'il puisse être transféré d'une JVM à l'autre et rétablit le flux d'octets dans l'objet d'origine.

//Interface

package Serial1 import java.io.Serializable public class Employee implements Serializable {private static final long serialVersionUID = 1L // Serial Version UID int id String name public Employee (int id, String name) {this.id = id this.name = name }}

// Sérialiser

chef vs marionnette vs sel
package Serial1 import java.io. * class Persist {public static void main (String args []) {try {Employee emp1 = new Employee (20110, 'John') Employee emp2 = new Employee (22110, 'Jerry') Employee emp3 = nouvel employé (20120, 'Sam') FileOutputStream fout = new FileOutputStream ('output.txt') ObjectOutputStream out = new ObjectOutputStream (fout) out.writeObject (emp1) out.writeObject (emp2) out.writeObject (emp3) out. flush () out.close () System.out.println ('La sérialisation et la désérialisation ont été exécutées avec succès')} catch (Exception e) {System.out.println (e)}}}

Production:

La sérialisation et la désérialisation ont été exécutées avec succès

Désérialisation : Il s'agit du processus inverse de sérialisation où le flux d'octets sérialisé d'un objet de l'expéditeur est recréé à l'extrémité de réception.

// Désérialiser

package Serial1 import java.io. * class Depersist {public static void main (String args []) {try {ObjectInputStream in = new ObjectInputStream (new FileInputStream ('output.txt')) Employee e1 = (Employee) in.readObject ( ) Employé e2 = (Employé) in.readObject () Employé e3 = (Employé) in.readObject () System.out.println (e1.id + '' + e1.name) System.out.println (e2.id + '' + e2.name) System.out.println (e3.id + '' + e3.name) in.close ()} catch (Exception e) {System.out.println (e)}}}

Production:

20110 Jean
22110 Jerry

20120 Sam

Avantages et inconvénients de la sérialisation en Java

Avantages:

  • Le processus de sérialisation est un intégré fonctionnalité qui ne nécessite pas de logiciel tiers pour exécuter la sérialisation
  • La procédure de sérialisation s'est avérée Facile et facile comprendre

  • La procédure de sérialisation est universel et les développeurs de différents milieux y sont familiers

  • Il est facile à utiliser et simple à personnaliser

  • Flux de données sérialisés supporte le cryptage, la compression, l'authentification et informatique Java sécurisée

  • Il y a beaucoup de technologies critiques s'appuyant sur la sérialisation.

Désavantages:

  • Objets alors que la désérialisation devient fragile et ils ne sont pas sûrs d'être désérialisés efficacement.

  • Les variables transitoires déclarées alors que la sérialisation crée de l'espace mémoire, mais le constructeur n'est pas appelé, ce qui entraîne l'échec de l'initialisation des variables transitoires entraînant un variation du flux Java standard.

  • Le processus de sérialisation est inefficace en termes d'utilisation de la mémoire.

  • Il n'est pas préférable d'utiliser la sérialisation dans les applications qui nécessitent accès simultané sans l'exigence de API tierces , car la sérialisation n'offre aucun mécanisme de contrôle de transition pour chaque SE.

  • La procédure de sérialisation échoue à offrir contrôle à grain fin pour accéder aux objets.

Exemples pratiques de sérialisation en Java

Sérialisation à l'aide de l'héritage

Cas - 1: Si Superclass est sérialisable, alors, par défaut, ses sous-classes sont également sérialisables.

Dans ce cas, le sous-classe est sérialisable par défaut si le superclasse met en œuvre le Interface sérialisable

package SerializationInheritance import java.io.FileInputStream import java.io.FileOutputStream import java.io.ObjectInputStream import java.io.ObjectOutputStream import java.io.Serializable classe A implémente Serializable {int i public A (int i) {this.i = i}} classe B étend A {int j public B (int i, int j) {super (i) this.j = j}} classe publique Test {public static void main (String [] args) lève l'exception {B b1 = new B (200 400) System.out.println ('i =' + b1.i) System.out.println ('j =' + b1.j) FileOutputStream fos = new FileOutputStream ('abc.ser') ObjectOutputStream oos = new ObjectOutputStream (fos) oos.writeObject (b1) oos.close () fos.close () System.out.println ('L'objet a été sérialisé') FileInputStream fis = new FileInputStream ('abc.ser') ObjectInputStream ois = new ObjectInputStream (fis) B b2 = (B) ois.readObject () ois.close () fis.close () System.out.println ('L'objet a été désérialisé') System.out.println ('i = '+ b2.i) System.out.println (' j = '+ b2.j)}}

Production:

j = 20
L'objet a été sérialisé
L'objet a été désérialisé
i = 200
j = 400

Cas - 2: Une sous-classe peut être sérialisée si elle implémente l'interface sérialisable même si une superclasse n'implémente pas l'interface sérialisable.

Dans ce cas, si le superclasse ne met pas en œuvre le Interface sérialisable , alors, les objets du sous-classe peut être sérialisé manuellement en implémentant l'interface sérialisable dans la sous-classe.

package SerializationInheritance import java.io.FileInputStream import java.io.FileOutputStream import java.io.ObjectInputStream import java.io.ObjectOutputStream import java.io.Serializable classe superclasse {int i superclasse publique (int i) {this.i = i} public superclass () {i = 50 System.out.println ('Superclass constructor called')}} classe sous-classe étend superclasse implémente Serializable {int j public subclass (int i, int j) {super (i) this.j = j }} public class test2 {public static void main (String [] args) jette une exception {sous-classe b1 = nouvelle sous-classe (10, 20) System.out.println ('i =' + b1.i) System.out.println ( 'j =' + b1.j) FileOutputStream fos = new FileOutputStream ('output.ser') ObjectOutputStream oos = new ObjectOutputStream (fos) oos.writeObject (b1) oos.close () fos.close () System.out.println ('L'objet a été sérialisé') FileInputStream fis = new FileInputStream ('output.ser') ObjectInputStream ois = new ObjectInputStream (fis) subclass b2 = (subclass) ois.readObject ( ) ois.close () fis.close () System.out.println ('L'objet a été désérialisé') System.out.println ('i =' + b2.i) System.out.println ('j =' + b2.j)}}

L'objet a été sérialisé
Constructeur de superclasse appelé
L'objet a été désérialisé
i = 50
j = 20

Cas - 3: Si la superclasse est sérialisable, mais que nous n'avons pas besoin que la sous-classe soit sérialisée.

Dans ce cas, la sérialisation de la sous-classe peut être empêchéeen mettant en œuvre le writeObject () et readObject () méthodes dans la sous-classe et il doit lancer NotSerializableException à partir de ces méthodes.

package SerializationInheritance import java.io.FileInputStream import java.io.FileOutputStream import java.io.IOException import java.io.NotSerializableException import java.io.ObjectInputStream import java.io.ObjectOutputStream import java.io.Serializable classe parent implémentation i public Parent (int i) {this.i = i}} classe enfant étend Parent {int j public child (int i, int j) {super (i) this.j = j} private void writeObject (ObjectOutputStream out) jette IOException {throw new NotSerializableException ()} private void readObject (ObjectInputStream in) throws IOException {throw new NotSerializableException ()}} public class test3 {public static void main (String [] args) throws Exception {child b1 = new child (100, 200) System.out.println ('i =' + b1.i) System.out.println ('j =' + b1.j) FileOutputStream fos = new FileOutputStream ('abc.ser') ObjectOutputStream oos = new ObjectOutputStream ( fos) oos.writeObject (b1) oos.close () fos.close () System.out.println ('Objet a été sérialisé ') FileInputStream fis = new FileInputStream (' abc.ser ') ObjectInputStream ois = new ObjectInputStream (fis) enfant b2 = (enfant) ois.readObject () ois.close () fis.close () System.out. println ('L'objet a été désérialisé') System.out.println ('i =' + b2.i) System.out.println ('j =' + b2.j)}}

Production:

i = 100
j = 200
Exception dans le thread 'main' java.io.NotSerializableException
à SerializationInheritance.child.writeObject (test3.java:48)
à sun.reflect.NativeMethodAccessorImpl.invoke0 (méthode native)

Sérialisation à l'aide d'un membre statique

La sérialisation du champ de membre statique est ignorée dans le processus de sérialisation. La sérialisation estlié au dernier état de l'objet. Par conséquent, seules les données associées à une instance spécifique d'une classe sontsérialisé mais pas le champ de membre statique.

package stati import java.io. * class StaticSerial implements Serializable {static int i = 100 public static void main (String ... ar) {StaticSerial ob = new StaticSerial () System.out.println ('Au moment de la sérialisation, le membre statique a la valeur: '+ i) try {FileOutputStream fos = new FileOutputStream (' F: File.ser ') ObjectOutputStream oos = new ObjectOutputStream (fos) oos.writeObject (ob) oos.close () i = 99 FileInputStream fis = new FileInputStream ('F: File.ser') ObjectInputStream ois = new ObjectInputStream (fis) ob = (StaticSerial) ois.readObject () ois.close () System.out.println ('Après la désérialisation, le membre statique a la valeur:' + i)} catch (Exception e) {System.out.println (e)}}}

Production:

Au moment de la sérialisation, le membre statique a la valeur: 100
Après la désérialisation, le membre statique a la valeur: 99

Interface externalisable

La Interface externalisable en Java est similaire à la sérialisation, mais la seule différence est qu'il est capable d'offrir sérialisation personnalisée où vous décidez des objets à endurer dans le flux.

L'interface externalisable est disponible dans java.io et propose deux méthodes:

  • public void writeExternal (ObjectOutput out) lève IOException
  • public void readExternal (ObjectInput in) lève IOException

Les principales différences entre la sérialisation et l'externalisation sont les suivantes:

  • la mise en oeuvre : L'interface externalisable exclut l'utilisateur de explicitement mentionner les objets à sérialiser. Dans l'interface de sérialisation, tous les objets et variables sont sérialisés dans le Durée.

  • Méthodes : L'interface externalisable se compose de deux méthodes, à savoir:

    • writeExternal ()

    • readExternal ()

Alors que l'interface sérialisable n'inclut aucune méthode.

  • Processus: Le processus de sérialisation dans l'interface externalisable fournit personnalisation au processus de sérialisation. Mais, l'interface de sérialisation fournira le défaut processus de sérialisation.

  • Compatibilité et contrôle en amont: L'interface externalisable prend en charge la sérialisation quel que soit le contrôle de version et le seul problème est que l'utilisateur doit être responsable lors de la sérialisation de Super Class. D'autre part, l'interface de sérialisation nécessite le même version de JVM aux deux extrémités mais il intègre la sérialisation automatique de tous les objets et classes, y compris la superclasse.

  • Constructeur public No-Arg: Besoins de l'interface d'externalisation Constructeur public No-Arg pour reconstruire l'objet sérialisé. Bien que l'interface de sérialisation ne nécessite pas de constructeur No-Arg, elle utilise à la place réflexion pour reconstruire l'objet ou la classe sérialisée.

package ext import java.io. * class Demo implémente java.io.Serializable {public int a public String b public Demo (int a, String b) {this.a = a this.b = b}} class Test {public static void main (String [] args) {Demo object = new Demo (1, 'Welcome to Edureka') String filename = 'file.ser' try {FileOutputStream file = new FileOutputStream (filename) ObjectOutputStream out = new ObjectOutputStream (file) out .writeObject (object) out.close () file.close () System.out.println ('L'objet a été sérialisé')} catch (IOException ex) {System.out.println ('IOException is catch')} Demo object1 = null try {FileInputStream file = new FileInputStream (filename) ObjectInputStream in = new ObjectInputStream (file) object1 = (Demo) in.readObject () in.close () file.close () System.out.println ('Object has been désérialisé ') System.out.println (' a = '+ object1.a) System.out.println (' b = '+ object1.b)} catch (IOException ex) {System.out.println (' IOException is catch ')} catch (ClassNotFoundException ex) {System.out .println ('ClassNotFoundException est interceptée')}}}

Mot-clé transitoire

Le mot clé transitoire est un mot-clé réservé en Java. Il est utilisé comme un variable modifier au moment du processus de sérialisation. La déclaration d'une variable avec le mot clé Transient évite que la variable ne soit sérialisée.

transformer l'objet en tableau php

UID de la version série

Avant le début du processus de sérialisation, chaque classe / objet sérialisable est associé à un numéro d'identification unique fourni par la JVM de la machine hôte. Cet identifiant unique s'appelle UID de la version série . Cet UID est utilisé comme une identification par la JVM de l'extrémité de réception pour confirmer que le même objet est en cours de désérialisation à l'extrémité de réception.

Controverses sur la sérialisation en Java

Oracle Les architectes ont l'intention de supprimer la sérialisation de Java car ils la considèrent comme un Horrible erreur de 1997 . Après des recherches intenses, les développeurs d'Oracle ont découvert quelques failles dans la conception de la procédure de sérialisation qui menacent les données.

En 1997,Mark Reinhold déclare - ' Nous aimons appeler la sérialisation 'le cadeau qui continue de donner', et le type de cadeau qu'elle continue de donner est des failles de sécurité. Probablement un tiers de toutes les vulnérabilités Java impliquaient une sérialisation, il pourrait être plus de la moitié. C'est une source étonnamment féconde de vulnérabilités, sans parler d'instabilités. ».

Il y a des chances que la sérialisation soit supprimée ou remplacée dans les prochaines mises à jour de Java et, d'autre part, pour un débutant en Java, la sérialisation ne pouvait pas être une option idéaliste dans leurs projets

Meilleures pratiques lors de l'utilisation de la sérialisation en Java

Voici quelques bonnes pratiques à suivre

  • Il est recommandé d'utiliser javadoc @ étiquette de série pour indiquer les champs sérialisables.
  • La .être Il est préférable d'utiliser l'extension pour les fichiers représentant des objets sérialisés.
  • Il n'est pas recommandé que les champs statiques ou transitoires subissent sérialisation par défaut.
  • Classes extensibles ne doit pas être sérialisé sauf s'il est obligatoire.
  • Classes intérieures doit être évité pour être impliqué dans la sérialisation.

Avec cela, nous sommes arrivés à la fin de cet article. J'espère que vous avez compris les bases de la sérialisation en Java, ses types et ses fonctionnalités.

Vérifiez par Edureka, une entreprise d'apprentissage en ligne de confiance avec un réseau de plus de 250 000 apprenants satisfaits répartis dans le monde entier. Le cours de formation et de certification Java J2EE et SOA d'Edureka est conçu pour les étudiants et les professionnels qui souhaitent devenir développeur Java. Le cours est conçu pour vous donner une longueur d'avance dans la programmation Java et vous former aux concepts Java de base et avancés ainsi que divers frameworks Java tels que Hibernate et Printemps .

Vous avez une question pour nous? Mentionnez-le dans la section commentaires de cet article «Sérialisation en Java» et nous vous répondrons dans les plus brefs délais.