logo

Serialisierung und Deserialisierung in Java mit Beispiel

Serialisierung ist ein Mechanismus zum Konvertieren des Zustands eines Objekts in einen Bytestrom. Deserialisierung ist der umgekehrte Prozess, bei dem der Bytestream verwendet wird, um das tatsächliche Java-Objekt im Speicher neu zu erstellen. Dieser Mechanismus wird verwendet, um das Objekt beizubehalten. Serialisieren-Deserialisieren-Java
Der erstellte Bytestream ist plattformunabhängig. Das auf einer Plattform serialisierte Objekt kann also auf einer anderen Plattform deserialisiert werden. Um ein Java-Objekt serialisierbar zu machen, implementieren wir das java.io.Serializable Schnittstelle. Die ObjectOutputStream-Klasse enthält writeObject() Methode zum Serialisieren eines Objekts.

public final void writeObject(Object obj)  throws IOException>

Die ObjectInputStream-Klasse enthält readObject() Methode zum Deserialisieren eines Objekts.

public final Object readObject()  throws IOException,  ClassNotFoundException>

Vorteile der Serialisierung



  1. Um den Zustand eines Objekts zu speichern/beizubehalten.
  2. Ein Objekt durch ein Netzwerk bewegen.

Es können nur die Objekte derjenigen Klassen serialisiert werden, die implementieren java.io.Serializable Schnittstelle. Serialisierbar ist ein Marker-Schnittstelle (hat kein Datenelement und keine Methode). Es wird verwendet, um Java-Klassen zu markieren, damit Objekte dieser Klassen bestimmte Funktionen erhalten können. Weitere Beispiele für Markierungsschnittstellen sind: Klonbar und Remote.

Punkte, die man sich merken sollte

Alphabet mit Zahlen

1. Wenn eine übergeordnete Klasse eine serialisierbare Schnittstelle implementiert hat, muss die untergeordnete Klasse diese nicht implementieren, umgekehrt ist dies jedoch nicht der Fall.
2. Über den Serialisierungsprozess werden nur nicht statische Datenelemente gespeichert.
3. Statische Datenelemente und vorübergehende Datenelemente werden nicht über den Serialisierungsprozess gespeichert. Wenn Sie also den Wert eines nicht statischen Datenelements nicht speichern möchten, machen Sie es vorübergehend.
4. Der Konstruktor des Objekts wird niemals aufgerufen, wenn ein Objekt deserialisiert wird.
5. Zugehörige Objekte müssen eine serialisierbare Schnittstelle implementieren. Beispiel :

class A implements Serializable{  // B also implements Serializable // interface. B ob=new B();  }>

SerialVersionUID Die Serialisierungslaufzeit ordnet jeder serialisierbaren Klasse eine Versionsnummer zu, die als SerialVersionUID bezeichnet wird. Diese wird während der Deserialisierung verwendet, um zu überprüfen, ob Sender und Empfänger eines serialisierten Objekts über geladene Klassen für dieses Objekt verfügen, die hinsichtlich der Serialisierung kompatibel sind. Wenn der Empfänger eine Klasse für das Objekt geladen hat, die eine andere UID als die entsprechende Klasse des Absenders hat, führt die Deserialisierung zu einer InvalidClassException .

Eine serialisierbare Klasse kann ihre eigene UID explizit deklarieren, indem sie einen Feldnamen deklariert. Es muss statisch, final und vom Typ long sein. d.h. ANY-ACCESS-MODIFIER static final long serialVersionUID=42L; Wenn eine serialisierbare Klasse nicht explizit eine serialVersionUID deklariert, berechnet die Serialisierungslaufzeit eine Standard-ID für diese Klasse basierend auf verschiedenen Aspekten der Klasse, wie in der Java Object Serialization Specification beschrieben. Es wird jedoch dringend empfohlen, dass alle serialisierbaren Klassen den Wert serialVersionUID explizit deklarieren, da seine Berechnung sehr empfindlich auf Klassendetails reagiert, die je nach Compiler-Implementierung variieren können. Jede Änderung der Klasse oder die Verwendung einer anderen ID kann sich auf die serialisierten Daten auswirken. Es wird außerdem empfohlen, einen privaten Modifikator für die UID zu verwenden, da dieser als geerbtes Mitglied nicht nützlich ist. Serienversion Der Serialver ist ein Tool, das mit JDK geliefert wird. Es wird verwendet, um die serialVersionUID-Nummer für Java-Klassen abzurufen.

Sie können den folgenden Befehl ausführen, um serialVersionUID serialver [-classpath classpath] [-show] [classname…] abzurufen. Beispiel 1:

Java




// Java code for serialization and deserialization> // of a Java object> import> java.io.*;> class> Demo>implements> java.io.Serializable> {> >public> int> a;> >public> String b;> >// Default constructor> >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>, 'geeksforgeeks');> >String filename = 'file.ser';> > >// Serialization> >try> >{> >//Saving of object in a file> >FileOutputStream file =>new> FileOutputStream(filename);> >ObjectOutputStream out =>new> ObjectOutputStream(file);> > >// Method for serialization of object> >out.writeObject(object);> > >out.close();> >file.close();> > >System.out.println('Object has been serialized');> >}> > >catch>(IOException ex)> >{> >System.out.println('IOException is caught');> >}> >Demo object1 =>null>;> >// Deserialization> >try> >{> >// Reading the object from a file> >FileInputStream file =>new> FileInputStream(filename);> >ObjectInputStream in =>new> ObjectInputStream(file);> > >// Method for deserialization of object> >object1 = (Demo)in.readObject();> > >in.close();> >file.close();> > >System.out.println('Object has been deserialized ');> >System.out.println('a = ' + object1.a);> >System.out.println('b = ' + object1.b);> >}> > >catch>(IOException ex)> >{> >System.out.println('IOException is caught');> >}> > >catch>(ClassNotFoundException ex)> >{> >System.out.println('ClassNotFoundException is caught');> >}> >}> }>

>

>

Ausgabe :

Object has been serialized Object has been deserialized  a = 1 b = geeksforgeeks>

Beispiel 2:

Java




Gimp Farbe ersetzen

// Java code for serialization and deserialization> // of a Java object> import> java.io.*;> class> Emp>implements> Serializable {> private> static> final> long> serialversionUID => >129348938L;> >transient> int> a;> >static> int> b;> >String name;> >int> age;> >// Default constructor> public> Emp(String name,>int> age,>int> a,>int> b)> >{> >this>.name = name;> >this>.age = age;> >this>.a = a;> >this>.b = b;> >}> }> public> class> SerialExample {> public> static> void> printdata(Emp object1)> >{> >System.out.println('name = ' + object1.name);> >System.out.println('age = ' + object1.age);> >System.out.println('a = ' + object1.a);> >System.out.println('b = ' + object1.b);> >}> public> static> void> main(String[] args)> >{> >Emp object =>new> Emp('ab',>20>,>2>,>1000>);> >String filename = 'shubham.txt';> >// Serialization> >try> {> >// Saving of object in a file> >FileOutputStream file =>new> FileOutputStream> >(filename);> >ObjectOutputStream out =>new> ObjectOutputStream> >(file);> >// Method for serialization of object> >out.writeObject(object);> >out.close();> >file.close();> >System.out.println('Object has been serialized '> >+ 'Data before Deserialization.');> >printdata(object);> >// value of static variable changed> >object.b =>2000>;> >}> >catch> (IOException ex) {> >System.out.println('IOException is caught');> >}> >object =>null>;> >// Deserialization> >try> {> >// Reading the object from a file> >FileInputStream file =>new> FileInputStream> >(filename);> >ObjectInputStream in =>new> ObjectInputStream> >(file);> >// Method for deserialization of object> >object = (Emp)in.readObject();> >in.close();> >file.close();> >System.out.println('Object has been deserialized '> >+ 'Data after Deserialization.');> >printdata(object);> >// System.out.println('z = ' + object1.z);> >}> >catch> (IOException ex) {> >System.out.println('IOException is caught');> >}> >catch> (ClassNotFoundException ex) {> >System.out.println('ClassNotFoundException' +> >' is caught');> >}> >}> }>

>

>

Ausgabe:

Object has been serialized Data before Deserialization. name = ab age = 20 a = 2 b = 1000 Object has been deserialized Data after Deserialization. name = ab age = 20 a = 0 b = 2000>

Beschreibung für die Ausgabe: Sie haben gesehen, dass sich beim Deserialisieren des Objekts die Werte von a und b geändert haben. Der Grund dafür ist, dass a als vorübergehend und b als statisch markiert wurde.

Im Falle von transiente Variablen:- Eine mit dem Schlüsselwort transient definierte Variable wird während des Serialisierungsprozesses nicht serialisiert. Diese Variable wird während der Deserialisierung mit dem Standardwert initialisiert. (z. B. für Objekte ist es null, für int ist es 0).

Im Falle von statische Variablen:- Eine mit dem Schlüsselwort static definierte Variable wird während des Serialisierungsprozesses nicht serialisiert. Diese Variable wird während der Deserialisierung mit dem aktuellen Wert geladen, der in der Klasse definiert ist.

Vorübergehend vs. endgültig:
Finale Variablen werden direkt durch ihre Werte an der Serialisierung beteiligt.
Daher ist es sinnlos, eine endgültige Variable als transient zu deklarieren.
//Der Compiler weist den Wert der endgültigen Variablen zu

Beispiel:

final int x= 10; int y = 20; System.out.println(x);// compiler will replace this as System.out.println(10)->10, weil x endgültig ist. System.out.println(y);//20>

Beispiel 3:

Java




//java code for final with transient> import> java.io.*;> class> Dog>implements> Serializable{> >int> i=>10>;> >transient> final> int> j=>20>;> }> class> GFG {> >public> static> void> main (String[] args)>throws> IOException,ClassNotFoundException> >{> >Dog d1=>new> Dog();> >//Serialization started> >System.out.println(>'serialization started'>);> >FileOutputStream fos=>new> FileOutputStream(>'abc.ser'>);> >ObjectOutputStream oos=>new> ObjectOutputStream(fos);> >oos.writeObject(d1);> >System.out.println(>'Serialization ended'>);> > >//Deserialization started> >System.out.println(>'Deserialization started'>);> >FileInputStream fis=>new> FileInputStream(>'abc.ser'>);> >ObjectInputStream ois=>new> ObjectInputStream(fis);> >Dog d2=(Dog) ois.readObject();> >System.out.println(>'Deserialization ended'>);> >System.out.println(>'Dog object data'>);> >//final result> >System.out.println(d2.i+>' '> +d2.j);> >}> }>

Cobol-Programmierung

>

>

Ausgabe

serialization started Serialization ended Deserialization started Deserialization ended Dog object data 10 20>