Einführung

Serialisierung ist die Umwandlung des Status eines Objekts in einen Byte-Stream; Deserialisierung macht das Gegenteil. Anders ausgedrückt ist Serialisierung die Umwandlung eines Java-Objekts in einen statischen Stream (Folge) von Bytes, die dann in einer Datenbank gespeichert oder über ein Netzwerk übertragen werden können.

Serialisierung und Deserialisierung

Der Serialisierungsprozess ist instanzunabhängig, d.h., objekte können auf einer Plattform serialisiert und auf einer anderen deserialisiert werden. Klassen, die für die Serialisierung in Frage kommen, müssen eine spezielle Marker-Schnittstelle Serialisierbar implementieren.

Sowohl ObjectInputStream als auch ObjectOutputStream sind High-Level-Klassen, die java.io.InputStream bzw. java.io.OutputStream erweitern. ObjectOutputStream kann primitive Typen und Diagramme von Objekten als Bytestrom in einen OutputStream schreiben. Diese Streams können anschließend mit ObjectInputStream gelesen werden.,

Die wichtigste Methode in ObjectOutputStream ist:

public final void writeObject(Object o) throws IOException;

Die ein serialisierbares Objekt in eine Sequenz (Stream) von Bytes konvertiert. In ähnlicher Weise ist die wichtigste Methode in ObjectInputStream:

Die einen Byte-Stream lesen und in ein Java-Objekt konvertieren kann. Dies kann dann auf das ursprüngliche Objekt zurückgesetzt werden.

Lassen Sie uns die Serialisierung mit einer Person-Klasse veranschaulichen. Beachten Sie, dass statische Felder zu einer Klasse gehören (im Gegensatz zu einem Objekt) und nicht serialisiert sind., Beachten Sie auch, dass wir das Schlüsselwort transient verwenden können, um Klassenfelder während der Serialisierung zu ignorieren:

public class Person implements Serializable { private static final long serialVersionUID = 1L; static String country = "ITALY"; private int age; private String name; transient int height; // getters and setters}

Der folgende Test zeigt ein Beispiel für das Speichern eines Objekts vom Typ Person in einer lokalen Datei Lesen Sie diesen Wert dann zurück in:

Wir haben ObjectOutputStream verwendet, um den Status dieses Objekts mithilfe von FileOutputStream in einer Datei zu speichern FileOutputStream. Die Datei „yourfile.txt “ wird im Projektverzeichnis erstellt. Diese Datei wird dann mit FileInputStream geladen. ObjectInputStream nimmt diesen Stream auf und konvertiert ihn in ein neues Objekt namens p2.,

Schließlich testen wir den Zustand des geladenen Objekts und es stimmt mit dem Zustand des ursprünglichen Objekts überein.

Beachten Sie, dass das geladene Objekt explizit in einen Personentyp umgewandelt werden muss.

Java-Serialisierung Vorsichtsmaßnahmen

Es gibt einige Einschränkungen, um die Serialisierung in Java.

3.1. Vererbung und Zusammensetzung

Wenn eine Klasse die Schnittstelle java.io.Serializable implementiert, sind auch alle ihre Unterklassen serialisierbar., Im Gegenteil, wenn ein Objekt einen Verweis auf ein anderes Objekt hat, müssen diese Objekte die serialisierbare Schnittstelle separat implementieren, sonst wird eine NotSerializableException ausgelöst:

public class Person implements Serializable { private int age; private String name; private Address country; // must be serializable too}

Wenn eines der Felder in einem serialisierbaren Objekt aus einem Array von Objekten besteht, müssen alle diese Objekte ebenfalls serialisierbar sein, oder es wird eine NotSerializableException ausgelöst.

3.2. Serielle Version UID

Die JVM ordnet jeder serialisierbaren Klasse eine Versionsnummer (long) zu., Es wird verwendet, um zu überprüfen, ob die gespeicherten und geladenen Objekte die gleichen Attribute haben und somit bei der Serialisierung kompatibel sind.

Diese Nummer kann von den meisten IDEs automatisch generiert werden und basiert auf dem Klassennamen, seinen Attributen und den zugehörigen Zugriffsmodifikatoren. Alle Änderungen führen zu einer anderen Nummer und können eine InvalidClassException verursachen.

Wenn eine serialisierbare Klasse keine serialVersionUID deklariert, generiert die JVM zur Laufzeit automatisch eine., Es wird jedoch dringend empfohlen, dass jede Klasse ihre serialVersionUID deklariert, da die generierte Klasse compilerabhängig ist und daher zu unerwarteten InvalidClassExceptions führen kann.

3.3. Benutzerdefinierte Serialisierung in Java

Java gibt eine Standardmethode an, mit der Objekte serialisiert werden können. Java-Klassen können dieses Standardverhalten überschreiben. Die benutzerdefinierte Serialisierung kann besonders nützlich sein, wenn Sie versuchen, ein Objekt mit nicht serialisierbaren Attributen zu serialisieren., Dies kann durch die Bereitstellung von zwei Methoden innerhalb der Klasse erfolgen, die wir serialisieren möchten:

private void writeObject(ObjectOutputStream out) throws IOException;

und

private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException;

Mit diesen Methoden können wir diese nicht serialisierbaren Attribute in andere Formen serialisieren, die serialisiert werden können:

public class Address { private int houseNumber; // setters and getters}

Der folgende Komponentententest testet diese benutzerdefinierte Serialisierung:

In diesem Code sehen wir, wie einige nicht serialisierbare Attribute gespeichert werden, indem die Adresse mit benutzerdefinierter Serialisierung serialisiert wird. Beachten Sie, dass wir die unserialisierbaren Attribute als vorübergehend markieren müssen, um die NotSerializableException zu vermeiden.,

In diesem kurzen Tutorial haben wir die Java-Serialisierung überprüft, wichtige Dinge besprochen, die Sie beachten sollten, und gezeigt, wie Sie die benutzerdefinierte Serialisierung durchführen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.