JavaRush /Java-Blog /Random-DE /Warum SerialVersionUID in der Serializable-Klasse in Java...
0xFF
Level 9
Донецк

Warum SerialVersionUID in der Serializable-Klasse in Java verwenden?

Veröffentlicht in der Gruppe Random-DE
Serializationund SerialVersionUIDbleibt für viele Java-Entwickler immer ein Rätsel. Ich sehe oft Fragen dazu, was ist SerialVersionUIDoder was passiert, wenn ich es nicht SerialVersionUIDin meiner Serializable-Klasse deklariere? Warum SerialVersionUID in der Serializable-Klasse in Java verwenden – 1Abgesehen 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 CustomerTyp SerialVersionUIDlong „ In diesem Artikel lernen Sie nicht nur die Grundlagen von Java kennen, SerialVersionUIDsondern auch dessen Auswirkungen auf den Prozess der Serialisierung und Deserialisierung. Wenn Sie eine Klasse deklarieren, beispielsweise Serializabledurch 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 SerialVersionUIDes während der Deserialisierung keine Übereinstimmung gibt, wird der Prozess mit einer Ausnahme InvalidClassExceptionim Stream „ main“ beendet java.io.InvalidClassExceptionund außerdem der Klassenname und die entsprechende Ausgabe ausgegeben SerialVersionUID. Eine schnelle Lösung zur Behebung dieses Problems besteht darin, SerialVersionUIDes zu kopieren und als Typkonstante private static final longin Ihrer Klasse zu definieren. In diesem Artikel erfahren wir, warum wir SerialVersionUIDin 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) Serializationist (Serialisierung) ein weiteres Thema, das es verdient, mehrmals gelesen zu werden.

Warum SerialVersionUID in Java verwenden?

Wie gesagt, wenn wir keinen Wert SerialVersionUIDwie static final longin 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, SerialVersionUIDwas 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 SerialVersionUIDin 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 SerialVersionUIDfü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 SerialVersionUIDund 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 serialverzum Generieren SerialVersionUIDfür Klassen verwenden. Dies ist besonders nützlich für die Entwicklung von Klassen; das Dienstprogramm wird SerialVersionUIDin einem einfach zu kopierenden Format zurückgegeben. serialverSie 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 serialverals GUIBefehl 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 SerialVersionUIDund 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.
  1. SerialVersionUIDWird verwendet, um die Version der serialisierten Daten anzugeben.

  2. Wenn wir nicht SerialVersionUIDin 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.

  3. 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. Warum SerialVersionUID in der Serializable-Klasse in Java - 2 verwenden?

  4. 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.

  5. 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 SerialVersionUIDJava. Jetzt wissen wir, warum es wichtig ist, SerialVersionUIDim 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
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION