Java-Serialisierung

Die Java-Serialisierung ist ein Prozess, bei dem ein Objekt in einen Byte-Stream umgewandelt wird, sodass das Objekt auf der Festplatte gespeichert, über ein Netzwerk übertragen oder im Speicher abgelegt und später deserialisiert werden kann, um den Byte-Stream wieder in ein Objekt umzuwandeln.

In Java wird die Serialisierung durch diejava.io.SerializableSchnittstelle implementiert. Diese Schnittstelle hat keine Methoden; sie ist nur eine Marker-Schnittstelle, die verwendet wird, um anzugeben, dass eine Klasse serialisiert werden kann.

Wenn Sie ein Objekt serialisieren, verpacken Sie es in eine spezielle Datei, die gespeichert, übertragen oder abgelegt werden kann. Die Deserialisierung hingegen öffnet diese Datei, liest die serialisierten Daten und stellt sie dann als Objekt zur Verwendung im Programm wieder her.

Serialisierung ist eine Methode zum Speichern, Übertragen und Wiederherstellen von Objekten. Sie ermöglicht es, Objekte zwischen verschiedenen Computern zu verschieben und gemeinsam zu nutzen, was für verteilte Systeme, Datenspeicherung und plattformübergreifende Kommunikation sehr nützlich ist.

Im Folgenden werden die grundlegenden Konzepte und die Verwendung der Java-Serialisierung beschrieben:

Implementieren Sie die Serializable-Schnittstelle: Um eine Klasse serialisierbar zu machen, müssen Sie die Klasse die java.io.Serializable-Schnittstelle implementieren lassen. Dies teilt dem Java-Compiler mit, dass die Klasse serialisiert werden kann, zum Beispiel:

Beispiel

import java.io.Serializable;

public class MyClass implements Serializable {
    // Klassenmitglieder und Methoden
}

Serialisieren eines Objekts:Verwenden Sie die Klasse ObjectOutputStream, um ein Objekt in einen Byte-Stream zu serialisieren. Das Folgende ist ein einfaches Beispiel:

Beispiel

MyClass obj = new MyClass();
try {
    FileOutputStream fileOut = new FileOutputStream("object.ser");
    ObjectOutputStream out = new ObjectOutputStream(fileOut);
    out.writeObject(obj);
    out.close();
    fileOut.close();
} catch (IOException e) {
    e.printStackTrace();
}

Der obige Code serialisiert das Objekt obj in eine Datei namens "object.ser".

Deserialisieren eines Objekts:Verwenden Sie die Klasse ObjectInputStream, um ein Objekt aus einem Byte-Stream zu deserialisieren. Das Folgende ist ein einfaches Beispiel:

Beispiel

MyClass obj = null;
try {
    FileInputStream fileIn = new FileInputStream("object.ser");
    ObjectInputStream in = new ObjectInputStream(fileIn);
    obj = (MyClass) in.readObject();
    in.close();
    fileIn.close();
} catch (IOException e) {
    e.printStackTrace();
} catch (ClassNotFoundException e) {
    e.printStackTrace();
}

Der obige Code liest den Byte-Stream aus der Datei "object.ser" und deserialisiert ihn in ein MyClass-Objekt.

Die Klassen ObjectInputStream und ObjectOutputStream sind High-Level-Datenströme, die Methoden zum Deserialisieren und Serialisieren von Objekten enthalten.

Die Klasse ObjectOutputStream enthält viele write-Methoden zum Schreiben verschiedener Datentypen, aber es gibt eine spezielle Methode, die eine Ausnahme bildet:

public final void writeObject(Object x) throws IOException

Die obige Methode serialisiert ein Objekt und sendet es an den Ausgabestream. Ähnlich enthält die Klasse ObjectInputStream die folgende Methode zum Deserialisieren eines Objekts:

public final Object readObject() throws IOException, ClassNotFoundException

Diese Methode ruft das nächste Objekt aus dem Stream ab und deserialisiert das Objekt. Ihr Rückgabewert ist Object, daher müssen Sie ihn in den passenden Datentyp umwandeln.

Beispiel

Um zu demonstrieren, wie Serialisierung in Java funktioniert, verwende ich die Employee-Klasse, die in einem vorherigen Tutorial erwähnt wurde. Angenommen, wir definieren die Employee-Klasse wie folgt; diese Klasse implementiert das Serializable-Interface.

Code der Datei Employee.java:

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("Sende einen Scheck an " + name + " " + address); } }

Bitte beachten Sie, dass zwei Bedingungen erfüllt sein müssen, damit ein Objekt einer Klasse erfolgreich serialisiert werden kann:

Die Klasse muss die Schnittstelle java.io.Serializable implementieren.

Alle Eigenschaften der Klasse müssen serialisierbar sein. Wenn eine Eigenschaft nicht serialisierbar ist, muss sie als transient markiert werden.

Wenn Sie wissen möchten, ob eine Standard-Java-Klasse serialisierbar ist, lesen Sie die Dokumentation für diese Klasse. Es ist sehr einfach zu testen, ob eine Instanz einer Klasse serialisiert werden kann; Sie müssen nur prüfen, ob die Klasse die Schnittstelle java.io.Serializable implementiert.


Serialisieren eines Objekts

Die Klasse ObjectOutputStream wird zum Serialisieren eines Objekts verwendet. Das folgende Beispiel SerializeDemo instanziiert ein Employee-Objekt und serialisiert dieses Objekt in eine Datei.

Nach der Ausführung des Programms wird eine Datei namens employee.ser erstellt. Das Programm erzeugt keine Ausgabe, aber Sie können verstehen, was das Programm tut, indem Sie den Code studieren.

Hinweis:Beim Serialisieren eines Objekts in eine Datei besteht die übliche Java-Konvention darin, der Datei die Erweiterung .ser zu geben.

Code der Datei SerializeDemo.java:

import java.io.*; public class SerializeDemo { public static void main(String [] args) { Employee e = new Employee(); e.name = "Reyan Ali"; e.address = "Phokka Kuan, Ambehta Peer"; e.SSN = 11122333; e.number = 101; try { FileOutputStream fileOut = new FileOutputStream("/tmp/employee.ser"); ObjectOutputStream out = new ObjectOutputStream(fileOut); out.writeObject(e); out.close(); fileOut.close(); System.out.printf("Serialisierte Daten wurden in /tmp/employee.ser gespeichert"); }catch(IOException i) { i.printStackTrace(); } } }

Deserialisieren eines Objekts

Das unten stehende Programm DeserializeDemo demonstriert die Deserialisierung, wobei /tmp/employee.ser das Employee-Objekt speichert.

Code der Datei DeserializeDemo.java:

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-Klasse nicht gefunden"); c.printStackTrace(); return; } System.out.println("Deserialisiertes Employee..."); System.out.println("Name: " + e.name); System.out.println("Adresse: " + e.address); System.out.println("SSN: " + e.SSN); System.out.println("Nummer: " + e.number); } }

Das Kompilierungs- und Ausführungsergebnis des obigen Programms ist wie folgt:

Deserialized Employee...
Name: Reyan Ali
Address:Phokka Kuan, Ambehta Peer
SSN: 0
Number:101

Hier sind die wichtigsten Punkte, die zu beachten sind:

Der try/catch-Block in der readObject()-Methode versucht, die ClassNotFoundException-Ausnahme abzufangen. Damit die JVM ein Objekt deserialisieren kann, muss sie die Klasse für den Bytecode finden können. Wenn die JVM die Klasse während der Objektdeserialisierung nicht finden kann, löst sie eine ClassNotFoundException-Ausnahme aus.

Beachten Sie, dass der Rückgabewert der readObject()-Methode in eine Employee-Referenz umgewandelt wird.

Wenn das Objekt serialisiert wird, ist der Wert der SSN-Eigenschaft 111222333, aber da diese Eigenschaft transient ist, wird der Wert nicht an den Ausgabestream gesendet. Daher ist die SSN-Eigenschaft des Employee-Objekts nach der Deserialisierung 0.

Andere Erweiterungen