Gemäß Wikipedia ist Serialisierung (oder Serialisierung) der Prozess der Übersetzung von Datenstrukturen oder Objektstatus in ein Format, das gespeichert (z. B. in einer Datei oder einem Speicherpuffer) oder übertragen (z. B. über eine Netzwerkverbindungsverbindung) und später rekonstruiert (möglicherweise in einer anderen Computerumgebung) werden kann.Wenn die resultierende Bitreihe gemäß dem Serialisierungsformat erneut gelesen wird, kann sie verwendet werden, um einen semantisch identischen Klon des ursprünglichen Objekts zu erstellen.,
Die Serialisierung ist also im Grunde genommen ein Prozess der Umwandlung eines Objekts in eine Folge von Bytes, festplatte oder Datenbank oder kann über Streams gesendet werden. Der umgekehrte Vorgang zum Erstellen eines Objekts aus einer Folge von Bytes wird als Deserialisierung bezeichnet.
Serialisierung und Deserialisierung in Java
Um unser Objekt zu serialisieren und in eine Datei zu deserialisieren, müssen wir ObjectOutputStream.writeObject()
und ObjectInputStream.readObject()
aufrufen .,
Eine Klasse muss eine serialisierbare Schnittstelle implementieren, die im java.io
– Paket vorhanden ist, um ihr Objekt erfolgreich zu serialisieren. Serializable ist eine Marker-Schnittstelle, die der implementierenden Klasse serialisierbares Verhalten hinzufügt.
Java stellt eine serialisierbare API bereit, die unter java.io
– Paket zum Serialisieren und Deserialisieren von Objekten gekapselt ist, darunter
java.io.serializable
java.io.Externalizable
ObjectInputStream
- und
ObjectOutputStream
usw.,
Punkte zu beachten,
1. Wenn eine übergeordnete Klasse eine serialisierbare Schnittstelle implementiert hat, muss die untergeordnete Klasse sie nicht implementieren, aber umgekehrt ist dies nicht der Fall.
2. Über den Serialisierungsprozess werden nur nicht statische Datenelemente gespeichert.
3. Statische Datenelemente und transiente Datenelemente werden nicht über Serialisierung gespeichert process.So, wenn Sie den Wert eines nicht statischen Datenelements nicht speichern möchten, machen Sie es vorübergehend.
4., Konstruktor des Objekts wird nie aufgerufen, wenn ein Objekt deserialisiert wird.
5. Zugeordnete Objekte müssen eine serialisierbare Schnittstelle implementieren.
serialVersionUID
Die Serialisierungslaufzeit ordnet jeder serialisierbaren Klasse, die serialVersionUID genannt wird, eine Versionsnummer zu, die während der Deserialisierung verwendet wird, um zu überprüfen, ob Sender und Empfänger eines serialisierten Objekts Klassen für dieses Objekt geladen haben, die in Bezug auf die Serialisierung kompatibel sind., Wenn der Empfänger eine Klasse für das Objekt geladen hat, die eine andere UID als die der entsprechenden Senderklasse 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, endgültig und vom Typ lang sein.
ich.,e-ANY-ACCESS-MODIFIER static final long serialVersionUID=42L;
Wenn eine serialisierbare Klasse eine serialVersionUID nicht explizit deklariert, berechnet die Serialisierungslaufzeit eine Standardklasse für diese Klasse basierend auf verschiedenen Aspekten der Klasse, wie in Java Object Serialization Specification beschrieben. Es wird jedoch dringend empfohlen, dass alle serialisierbaren Klassen den serialVersionUID-Wert explizit deklarieren, da seine Berechnung sehr empfindlich auf Klassendetails reagiert, die je nach Compiler-Implementierungen variieren können, jede Änderung der Klasse oder die Verwendung einer anderen ID die serialisierten Daten beeinflussen kann.,
Es wird auch empfohlen, einen privaten Modifikator für die UID zu verwenden, da er als vererbtes Mitglied nicht nützlich ist.
Bei transienten 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. (zB: Für Objekte ist es null, für int ist es 0).
Im Falle von statischen Variablen: – Eine Variable mit statischen Schlüsselwort definiert wird während der Serialisierung Prozess nicht serialisiert.Diese Variable wird mit dem aktuellen Wert geladen, der während der Deserialisierung in der Klasse definiert wurde.,
Serialisierung in Java
Deserialisierung
Das Kontaktfeld ist null,da es als statisch markiert wurde und, wie bereits erwähnt, keine statischen Felder serialisiert werden.
HINWEIS: Statische Member werden niemals serialisiert, da sie mit class not object of class verbunden sind.
- Die Serialisierung ist der Prozess des Speicherns des Status eines Objekts in einer Folge von Bytes, die dann in einer Datei gespeichert oder über das Netzwerk gesendet werden können, und die Deserialisierung ist der Prozess der Rekonstruktion eines Objekts aus diesen Bytes.,
- Es können nur Unterklassen der
Serializable
Schnittstelle serialisiert werden. - Wenn unsere Klasse keine
Serializable
Schnittstelle implementiert oder wenn sie einen Verweis auf eine nichtSerializable
Klasse hat, wirft JVMNotSerializableException
. - Alle
transient
undstatic
Felder werden nicht serialisiert. - Mit der
serialVersionUID
wird überprüft, ob die serialisierten und deserialisierten Objekte dieselben Attribute haben und somit mit der Deserialisierung kompatibel sind., - Wir sollten erstellen Sie ein
serialVersionUID
– Bereich in unserer Klasse so, wenn wir ändern unsere Klasse Struktur (hinzufügen/entfernen von Feldern) JVM wird nicht durchInvalidClassException
. Wenn wir es nicht bereitstellen, stellt JVM eine bereit, die sich möglicherweise ändert, wenn sich unsere Klassenstruktur ändert. - Wir können das standardmäßige Serialisierungsverhalten in unserer Java-Klasse überschreiben, indem wir die Implementierung der Methoden
writeObject
undreadObject
bereitstellen., - Und wir können
ObjectOutputStream.defaultWriteObject()
undObjectInputStream.defaultReadObject
vonwriteObject
undreadObject
Methoden aufrufen, um die Standardserialisierungs-und Deserialisierungslogik abzurufen. - Wir können
NotSerializableException
exception fromwriteObject
undreadObject
, wenn wir nicht möchten, dass unsere Klasse serialisiert oder deserialisiert wird.
Leave a Reply