- Serialisierung
- Serialisierbare Schnittstelle
- Beispiel für Serialisierung
- Beispiel für Deserialisierung
- Serialisierung mit Vererbung
- Externalisierbare Schnittstelle
- 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.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 {} aus | Es erstellt einen ObjectOutputStream, der in den angegebenen OutputStream schreibt. |
Wichtige Methoden
Methode | Beschreibung |
---|---|
1) public final void writeObject(Object obj) löst eine IOException {} aus | Es schreibt das angegebene Objekt in den ObjectOutputStream. |
2) public void flush() löst eine IOException {} aus | Es löscht den aktuellen Ausgabestream. |
3) public void close() löst eine IOException {} aus | Es 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 {} aus | Es erstellt einen ObjectInputStream, der aus dem angegebenen InputStream liest. |
Wichtige Methoden
Methode | Beschreibung |
---|---|
1) öffentliches finales Objekt readObject() löst IOException, ClassNotFoundException{} aus | Es liest ein Objekt aus dem Eingabestream. |
2) public void close() löst eine IOException {} aus | Es 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:
successLaden 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 raviLaden 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:
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; } }