Frage

Warum wird die serialVersionUID automatisch generiert? Ich war auf einem Anwendungsserver in ein Problem laufen, wo scheinbar eine alte Klasse zwischengespeichert wurde.

War es hilfreich?

Lösung

serialVersionUID wird nicht automatisch generiert, weil es gefährlich ist. Wenn serialVersionUID gesetzt ist, es bedeutet, dass zwei Versionen einer Klasse in Bezug auf die Serialisierung kompatibel sind.

Stellen Sie eine Klasse namens Foo, und es hat keine serialVersionUID (Standardeinstellung), und Sie serialisiert eine Instanz von Foo in eine Datei. Später fügen Sie einige neue Mitglieder in der Foo-Klasse. Wenn Sie versuchen, das Foo-Objekt aus der Datei deserialisiert, erhalten Sie eine Serialisierung Ausfall erhalten, dass die Objekte nicht kompatibel sind. Sie sind nicht kompatibel, das ist , was Sie wollen und ist die Standardeinstellung. Sie sind nicht kompatibel, weil neue Mitglieder in der Foo-Klasse können nicht von der alten serialisierten Instanz von Foo initialisiert werden.

Nun könnte man sagen: „Mir ist es egal, in meiner Anwendung es akzeptabel ist, für diese Felder nicht initialisiert werden“. Wenn die wirklich der Fall ist, können Sie die serialVersionUID der neue Foo Klasse setzen das gleiche wie die alt Foo Klasse. Dies wird Java sagen, dass die Objekte in Bezug auf serializablity kompatibel sind, und Java nicht beschweren, wenn Sie die alten Foo Instanz in den neuen Foo Klasse Deserialisieren (aber die neuen Felder werden noch nicht initialisiert werden).

Wenn Sie eine neue Klasse zum ersten Mal erstellen, und stellen Sie die serialVersionUID, Sie betreten einen Vertrag . Dieser Vertrag ist, „Für alle zukünftigen Versionen dieser Klasse mit dem gleichen serialVersionUID, ich werde garantiert sie in Bezug auf Zustand und Serialisierung kompatibel sind“ .

Wenn Sie eine Klasse ändern, und Sie explizit wollen nicht zulassen Deserialisierung von alten Versionen können Sie die serialVersionUID auf einen neuen Wert ändern. Dadurch wird eine Ausnahme ausgelöst werden, wenn ein altes Objekt versucht wird deserialisiert in eine neue Instanz der Klasse werden.

Andere Tipps

Es wird automatisch generiert, basierend auf der Struktur der Klasse. Wenn sich die Struktur ändert, ist die ID (gemäß dem Serialisierung Spezifikation es ist ein hashof der Klasse).

So würden Sie besser eine explizite serialVersionUID definieren.

Wenn Sie Eclipse als IDE verwenden, können Sie mit der rechten Maustaste auf die Warnung über die fehlende serialVersionUID und Sie werden zwei Optionen erhalten:

1) Definieren Sie den Eclipse-Standard, der den Wert 1L hat; oder in 2) Definieren Sie eine zufällig generierte long-Wert

Wenn Sie sich über die Versionierung von serialisiert Objekte kümmern, müssen Sie manuell einen neuen Wert regenerieren jedes Mal, wenn Sie die Klasse ändern. Die Javadoc für den Serializable Schnittstelle hat dies zu sagen, was passiert, wenn Sie nicht über einen serialVersionUID überhaupt erklären:

  

Wenn eine serializable Klasse nicht explizit eine serialVersionUID erklären, dann wird die Serialisierung Laufzeit einen Standard serialVersionUID Wert für diese Klasse auf der Grundlage verschiedenen Aspekte der Klasse berechnen, wie in der Java (TM) Objektserialisierung Spezifikation beschrieben. Es wird jedoch dringend empfohlen, dass alle serializable Klassen explizit serialVersionUID Werte deklarieren, da die Standard serialVersionUID Berechnung sehr empfindlich auf Klasse Details, die auf Compiler-Implementierungen variieren, und in unerwarteten InvalidClassExceptions während der Deserialisierung somit zur Folge haben können. Daher einen konsistenten serialVersionUID Wert über verschiedene Java-Compiler-Implementierungen zu gewährleisten, wird eine serializable Klasse muss einen expliziten serialVersionUID Wert.

In der Praxis habe ich festgestellt, dass selbst wenn Sie mit identischen Quellcode auf zwei oder mehr Maschinen (ausgecheckt von Subversion, zum Beispiel) beginnen, wo serialVersionUID in einer Klasse nicht definiert wurde, die Compiler generierten Wert in der Klasse auf jeder Maschine anders, wenn der Code kompiliert. Dies kann dazu führen, Fehler während der Entwicklung verwirrend.

Wenn Sie sicher sind, dass Sie nie eine Situation haben werden, wo Sie abgestanden serialisierte Objekte haben, die out-of-sync mit einer neueren Version der Klasse (oder zwei JVMs Senden out-of-sync serialisiert Objekte zueinander vielleicht über ein Netzwerk oder Socket-Verbindung), dann nur einen Wert von 1L für serialVersionUID gesetzt und lassen sie es auf diese Weise für immer.

http: // download-LLNW .oracle.com / JavaSE / 6 / docs / api / java / io / Serializable.html

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top