logo

Serialisierung und Deserialisierung in Java

  1. Serialisierung
  2. Serialisierbare Schnittstelle
  3. Beispiel für Serialisierung
  4. Beispiel für Deserialisierung
  5. Serialisierung mit Vererbung
  6. Externalisierbare Schnittstelle
  7. Serialisierung und statisches Datenelement

Serialisierung in Java ist ein Mechanismus von Schreiben des Zustands eines Objekts in einen Byte-Stream . Es wird hauptsächlich in den Technologien Hibernate, RMI, JPA, EJB und JMS verwendet.

Der umgekehrte Vorgang der Serialisierung wird aufgerufen Deserialisierung wobei Byte-Stream in ein Objekt konvertiert wird. Der Serialisierungs- und Deserialisierungsprozess ist plattformunabhängig. Das bedeutet, dass Sie ein Objekt auf einer Plattform serialisieren und auf einer anderen Plattform deserialisieren können.

Um das Objekt zu serialisieren, rufen wir das auf writeObject() Methode von ObjectOutputStream Klasse, und für die Deserialisierung nennen wir die readObject() Methode von ObjectInputStream Klasse.

Wir müssen das umsetzen Serialisierbar Schnittstelle zur Serialisierung des Objekts.

Vorteile der Java-Serialisierung

Es wird hauptsächlich verwendet, um den Status eines Objekts im Netzwerk zu übertragen (dies wird als Marshalling bezeichnet).

Java-Serialisierung

java.io.Serializable-Schnittstelle

Serialisierbar ist eine Markierungsschnittstelle (hat kein Datenelement und keine Methode). Es wird verwendet, um Java-Klassen zu „markieren“, damit die Objekte dieser Klassen eine bestimmte Fähigkeit erhalten. Der Klonbar Und Fernbedienung sind auch Marker-Schnittstellen.

Der Serialisierbar Die Schnittstelle muss von der Klasse implementiert werden, deren Objekt beibehalten werden muss.

Die String-Klasse und alle Wrapper-Klassen implementieren das java.io.Serializable Schnittstelle standardmäßig.

Sehen wir uns das folgende Beispiel an:

Student.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; } } 

Im obigen Beispiel Student Die Klasse implementiert eine serialisierbare Schnittstelle. Jetzt können seine Objekte in einen Stream umgewandelt werden. Die Hauptklassenimplementierung von wird im nächsten Code gezeigt.

ObjectOutputStream-Klasse

Die ObjectOutputStream-Klasse wird verwendet, um primitive Datentypen und Java-Objekte in einen OutputStream zu schreiben. Es können nur Objekte in Streams geschrieben werden, die die java.io.Serializable-Schnittstelle unterstützen.

Konstrukteur

1) public ObjectOutputStream(OutputStream out) löst eine IOException {} ausEs erstellt einen ObjectOutputStream, der in den angegebenen OutputStream schreibt.

Wichtige Methoden

MethodeBeschreibung
1) public final void writeObject(Object obj) löst eine IOException {} ausEs schreibt das angegebene Objekt in den ObjectOutputStream.
2) public void flush() löst eine IOException {} ausEs löscht den aktuellen Ausgabestream.
3) public void close() löst eine IOException {} ausEs schließt den aktuellen Ausgabestream.

ObjectInputStream-Klasse

Ein ObjectInputStream deserialisiert Objekte und primitive Daten, die mit einem ObjectOutputStream geschrieben wurden.

Konstrukteur

1) public ObjectInputStream(InputStream in) löst eine IOException {} ausEs erstellt einen ObjectInputStream, der aus dem angegebenen InputStream liest.

Wichtige Methoden

MethodeBeschreibung
1) öffentliches finales Objekt readObject() löst IOException, ClassNotFoundException{} ausEs liest ein Objekt aus dem Eingabestream.
2) public void close() löst eine IOException {} ausEs schließt ObjectInputStream.

Beispiel für Java-Serialisierung

In diesem Beispiel werden wir das Objekt von serialisieren Student Klasse aus dem obigen Code. Die Methode writeObject() der Klasse ObjectOutputStream bietet die Funktionalität zum Serialisieren des Objekts. Wir speichern den Status des Objekts in der Datei mit dem Namen 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);} } } 

Ausgabe:

 success 
Laden Sie dieses Serialisierungsbeispiel herunter

Beispiel für Java-Deserialisierung

Unter Deserialisierung versteht man den Prozess der Rekonstruktion des Objekts aus dem serialisierten Zustand. Es handelt sich um den umgekehrten Vorgang der Serialisierung. Sehen wir uns ein Beispiel an, in dem wir die Daten von einem deserialisierten Objekt lesen.

Unter Deserialisierung versteht man den Prozess der Rekonstruktion des Objekts aus dem serialisierten Zustand. Es handelt sich um den umgekehrten Vorgang der Serialisierung. Sehen wir uns ein Beispiel an, in dem wir die Daten von einem deserialisierten Objekt lesen.

Depersist.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);} } } 

Ausgabe:

211 ravi 
Laden Sie dieses Beispiel der Deserialisierung herunter

Java-Serialisierung mit Vererbung (IS-A-Beziehung)

Wenn eine Klasse implementiert Serialisierbare Schnittstelle dann sind auch alle Unterklassen serialisierbar. Sehen wir uns das folgende Beispiel an:

Serialisieren Sie ISA.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);} } } 

Ausgabe:

 success 211 ravi Engineering 50000 

Die SerializeISA-Klasse hat das Student-Klassenobjekt serialisiert, das die Person-Klasse erweitert, die serialisierbar ist. Die Eigenschaften der übergeordneten Klasse werden an die Unterklassen vererbt. Wenn die übergeordnete Klasse also serialisierbar ist, wäre dies auch für die Unterklasse der Fall.

Java-Serialisierung mit Aggregation (HAS-A-Beziehung)

Wenn eine Klasse einen Verweis auf eine andere Klasse hat, müssen alle Verweise serialisierbar sein, andernfalls wird der Serialisierungsprozess nicht durchgeführt. In diesem Fall, NotSerializableException wird zur Laufzeit geworfen.

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; } } 

Student.java

Registerübertragungslogik
 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; } } 

Da Address nicht serialisierbar ist, können Sie die Instanz der Student-Klasse nicht serialisieren.

Hinweis: Alle Objekte innerhalb eines Objekts müssen serialisierbar sein.

Java-Serialisierung mit dem statischen Datenelement

Wenn eine Klasse ein statisches Datenelement enthält, wird es nicht serialisiert, da „statisch“ der Teil der Klasse und kein Objekt ist.

Employee.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; } } 

Java-Serialisierung mit Array oder Sammlung

Regel: Im Falle eines Arrays oder einer Sammlung müssen alle Objekte des Arrays oder der Sammlung serialisierbar sein. Wenn ein Objekt nicht serialisierbar ist, schlägt die Serialisierung fehl.

Externalisierbar in Java

Die Externalizable-Schnittstelle bietet die Möglichkeit, den Status eines Objekts im Komprimierungsformat in einen Bytestream zu schreiben. Es handelt sich nicht um eine Markierungsschnittstelle.

Die Externalizable-Schnittstelle bietet zwei Methoden:

    public void writeExternal(ObjectOutput out) löst eine IOException aus public void readExternal(ObjectInput in) löst eine IOException aus

Transientes Java-Schlüsselwort

Wenn Sie kein Datenelement einer Klasse serialisieren möchten, können Sie es als transient markieren.

Employee.java

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

Jetzt wird die ID nicht serialisiert. Wenn Sie das Objekt nach der Serialisierung deserialisieren, erhalten Sie nicht den Wert der ID. Es wird immer der Standardwert zurückgegeben. In diesem Fall wird 0 zurückgegeben, da der Datentyp von id eine Ganzzahl ist.

Weitere Informationen finden Sie auf der nächsten Seite.

SerialVersionUID

Der Serialisierungsprozess zur Laufzeit ordnet jeder serialisierbaren Klasse eine ID zu, die als SerialVersionUID bezeichnet wird. Es wird verwendet, um den Sender und Empfänger des serialisierten Objekts zu überprüfen. Sender und Empfänger müssen identisch sein. Zur Überprüfung wird SerialVersionUID verwendet. Sender und Empfänger müssen die gleiche SerialVersionUID haben, andernfalls InvalidClassException wird ausgelöst, wenn Sie das Objekt deserialisieren. Wir können auch unsere eigene SerialVersionUID in der Serializable-Klasse deklarieren. Dazu müssen Sie ein Feld SerialVersionUID erstellen und diesem einen Wert zuweisen. Es muss vom Typ „lang“ mit „statisch“ und „final“ sein. Es wird empfohlen, das Feld serialVersionUID in der Klasse explizit zu deklarieren und es auch privat zu machen. Zum Beispiel:

 private static final long serialVersionUID=1L; 

Die Serializable-Klasse sieht nun folgendermaßen aus:

Employee.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; } }