Serialization
und
SerialVersionUID
bleibt für viele Java-Entwickler immer ein Rätsel. Ich sehe oft Fragen dazu, was ist
SerialVersionUID
oder was passiert, wenn ich es nicht
SerialVersionUID
in meiner
Serializable
-Klasse deklariere?
Abgesehen davon, dass sie verwirrend ist und nur selten verwendet wird, ist ein weiterer Grund für diese Frage die fehlende Warnung der Eclipse-IDE
SerialVersionUID
, zum Beispiel: „
Die Serializable-Klasse Customer deklariert kein statisches finales SerialVersionUID-FeldSerializable
vom
Customer
Typ
SerialVersionUID
long „ In diesem Artikel lernen Sie nicht nur die Grundlagen von Java kennen,
SerialVersionUID
sondern auch dessen Auswirkungen auf den Prozess der Serialisierung und Deserialisierung. Wenn Sie eine Klasse deklarieren, beispielsweise
Serializable
durch die Implementierung einer Token-Schnittstelle
java.io.Serializable
, speichert die Java-Laufzeitumgebung eine Instanz dieser Klasse mithilfe des Standardserialisierungsmechanismus auf der Festplatte, es sei denn, Sie konfigurieren den Prozess für die Verwendung
der Externalizable-Schnittstelle . Während der Serialisierung erstellt die Java-Laufzeitumgebung eine Versionsnummer für die Klasse, damit sie diese später deserialisieren kann. In Java wird diese Versionsnummer als
SerialVersionUID
. Wenn
SerialVersionUID
es während der Deserialisierung keine Übereinstimmung gibt, wird der Prozess mit einer Ausnahme
InvalidClassException
im Stream „
main
“ beendet
java.io.InvalidClassException
und außerdem der Klassenname und die entsprechende Ausgabe ausgegeben
SerialVersionUID
. Eine schnelle Lösung zur Behebung dieses Problems besteht darin,
SerialVersionUID
es zu kopieren und als Typkonstante
private
static
final
long
in Ihrer Klasse zu definieren. In diesem Artikel erfahren wir, warum wir
SerialVersionUID
in Java verwenden sollten und wie wir das Serialver-JDK-Tool zum Generieren dieser ID verwenden. Wenn Sie neu in der Serialisierung sind, können Sie sich auch
die Top 10 der Interviewfragen zur Java-Serialisierung ansehen , um Ihr Wissen einzuschätzen und Lücken in Ihrem Verständnis zu finden, die Sie weiter lesen können. Wie
Concurrency
(Parallelität) und
Multi-threading
(Multithreading)
Serialization
ist (Serialisierung) ein weiteres Thema, das es verdient, mehrmals gelesen zu werden.
Warum SerialVersionUID in Java verwenden?
Wie gesagt, wenn wir keinen Wert
SerialVersionUID
wie
static
final
long
in unserer Klasse definiert haben, übernimmt der Serialisierungsmechanismus dies für uns. Dieser Mechanismus reagiert auf viele Details, einschließlich der Felder Ihrer Klasse, ihrer Zugriffsmodifikatoren, der von ihr implementierten Schnittstellen und sogar verschiedener Compiler-Implementierungen; alle Änderungen an der Klasse oder die Verwendung eines anderen Compilers können zu einem anderen Ergebnis führen,
SerialVersionUID
was letztendlich auch der Fall sein wird Verhindern Sie, dass die serialisierten Daten erneut geladen werden. Es ist riskant, sich beim Generieren dieser ID auf den Serialisierungsmechanismus von Java zu verlassen. Deshalb ist es eine gute Idee, sie explizit
SerialVersionUID
in Ihrer
Serializable-Klasse zu definieren . Ich empfehle dringend, den Java-Klassiker
„Effective Java“ von Joshua Bloch zu lesen , um die Java-Serialisierung und die Probleme einer falschen Handhabung zu verstehen. Übrigens stellt das JDK auch ein Tool bereit
serialver
, das sich im
bin -Verzeichnis des JAVA_HOME- Verzeichnisses auf meinem Computer befindet,
C:\Program Files\Java\jdk1.6.0_26\bin\serialver.exe , das zum Generieren verwendet werden kann
SerialVersionUID
für alte Klassen. Dies ist sehr nützlich, wenn Sie Änderungen an Ihrer Klasse vorgenommen haben, die die Serialisierung unterbrechen und Ihre Anwendung serialisierte Instanzen nicht neu laden kann. Mit diesem Dienstprogramm können Sie ganz einfach alte Instanzen erstellen
SerialVersionUID
und es dann explizit verwenden, indem Sie das Feld als
private static final long SerialVersionUID
deklarieren . Aus Performance- und Sicherheitsgründen wird übrigens dringend empfohlen, für die Serialisierung das reguläre Binärformat zu verwenden; auch hier gibt es in „Effective Java“ mehrere Absätze, die die Vorteile des regulären Formats sehr detailliert aufzeigen.
So verwenden Sie das Serialver-JDK-Dienstprogramm zum Generieren der SerialVersionUID
Sie können
serialver
zum Generieren
SerialVersionUID
für Klassen verwenden. Dies ist besonders nützlich für die Entwicklung von Klassen; das Dienstprogramm wird
SerialVersionUID
in einem einfach zu kopierenden Format zurückgegeben.
serialver
Sie können das JDK-Dienstprogramm wie im Beispiel gezeigt verwenden :
$ serialver
use: serialver [-classpath classpath] [-show] [classname...]
$ serialver -classpath . Hello
Class Hello is not Serializable.
$ serialver -classpath . Hello
Hello: static final long SerialVersionUID = -4862926644813433707L;
Sie können das Dienstprogramm auch
serialver
als
GUI
Befehl verwenden
$ serialver –show
. Dadurch wird ein Inspektor geöffnet
serial version
, der den vollständigen Klassennamen übernimmt und anzeigt
Serial version
.
Zusammenfassung
Nachdem wir nun wissen, was es ist
SerialVersionUID
und warum es wichtig ist, es in einer
Serializable
-Klasse zu deklarieren, ist es an der Zeit, einige wichtige Fakten im Zusammenhang mit Java SerialVersionUID zu besprechen.
SerialVersionUID
Wird verwendet, um die Version der serialisierten Daten anzugeben.
- Wenn wir nicht
SerialVersionUID
in unserer Klasse deklarieren, erledigt das die Java-Laufzeit für uns, aber dieser Prozess reagiert empfindlich auf viele Metadaten der Klasse, einschließlich der Anzahl der Felder, der Feldtypen, Feldzugriffsmodifikatoren und Schnittstellen, die in der Klasse implementiert sind usw. Die genauen Informationen finden Sie in der Serialisierungsdokumentation von Oracle.
- Es wird empfohlen, SerialVersionUID als private statische finale lange Variable zu deklarieren, um den Standardmechanismus zu vermeiden. Einige IDEs, wie zum Beispiel Eclipse , geben auch Warnungen aus, wenn Sie dies vergessen, zum Beispiel: „Die Serializable-Klasse Customer deklariert kein statisches finales SerialVersionUID-Feld vom Typ long.“ . Obwohl Sie diese Warnung deaktivieren können, indem Sie zu „Fenster“ > „Einstellungen“ > „Java“ > „Compiler“ > „Fehler/Warnungen“ > „Potenzielle Programmierprobleme“ gehen, empfehle ich, dies nicht zu tun. Nur wenn eine Datenwiederherstellung nicht erforderlich ist, kann ich dabei nachlässig sein. So sieht dieser Fehler in der Eclipse-IDE aus. Sie müssen lediglich die erste schnelle Entscheidung treffen.
- Sie können auch das Dienstprogramm serialver aus dem JDK verwenden, um eine serielle Version für Klassen in Java zu generieren. Das Dienstprogramm verfügt außerdem über eine GUI, die durch Übergabe des Parameters aktiviert wird
show
.
- Die beste Vorgehensweise bei der Serialisierung besteht darin, explizit zu deklarieren
SerialVersionUID
, um Probleme mit der Deserialisierung zu vermeiden, insbesondere wenn Sie mit einer Client-Server-Anwendung arbeiten, die auf serialisierten Daten basiert, wie z. B. RMI.
Es dreht sich alles um
SerialVersionUID
Java. Jetzt wissen wir, warum es wichtig ist,
SerialVersionUID
im Unterricht richtig zu deklarieren. Sie können Ihrer IDE für diese Erinnerung danken, die möglicherweise die Deserialisierung Ihrer Klasse unterbrechen könnte. Wenn Sie mehr über Serialisierung und verwandte Konzepte erfahren möchten, können Sie sich auch diese tollen Artikel ansehen.
Original
hier
GO TO FULL VERSION