3426 Stimmen

Was ist eine serialVersionUID und warum sollte ich sie verwenden?

Eclipse gibt Warnungen aus, wenn ein serialVersionUID fehlt.

Die serialisierbare Klasse Foo deklariert keine statische finale serialVersionUID-Feld vom Typ long

¿Qué es? serialVersionUID und warum ist sie wichtig? Bitte zeigen Sie ein Beispiel, bei dem fehlende serialVersionUID wird ein Problem verursachen.

7 Stimmen

Finden Sie eine gute Praxis über serialversionUID; dzone.com/articles/what-is-serialversionuid

23voto

Nitesh Soni Punkte 251

Um die Bedeutung des Feldes serialVersionUID zu verstehen, sollte man wissen, wie Serialisierung/Desialisierung funktioniert.

Wenn ein Objekt einer serialisierbaren Klasse serialisiert wird, assoziiert Java Runtime eine serielle Versionsnummer (genannt serialVersionUID) mit diesem serialisierten Objekt. Wenn Sie dieses serialisierte Objekt deserialisieren, gleicht Java Runtime die serialVersionUID des serialisierten Objekts mit der serialVersionUID der Klasse ab. Nur wenn beide übereinstimmen, wird mit dem weiteren Prozess der Deserialisierung fortgefahren, andernfalls wird eine InvalidClassException geworfen.

Daraus folgt, dass die serialVersionUID des serialisierten Objekts mit der serialVersionUID der Klasse übereinstimmen muss, damit der Serialisierungs-/Desialisierungsprozess erfolgreich ist. Wenn der Programmierer den serialVersionUID-Wert explizit im Programm angibt, wird derselbe Wert mit dem serialisierten Objekt und der Klasse assoziiert, unabhängig von der Serialisierungs- und Deserialisierungsplattform (z.B. kann die Serialisierung auf einer Plattform wie Windows unter Verwendung von Sun oder MS JVM und die Deserialisierung auf einer anderen Plattform wie Linux unter Verwendung von Zing JVM durchgeführt werden).

Aber wenn serialVersionUID nicht vom Programmierer angegeben wird, dann wird bei der Serialisierung \DeSerialization eines beliebigen Objekts zu berechnen, verwendet die Java-Laufzeitumgebung ihren eigenen Algorithmus, um sie zu berechnen. Dieser Algorithmus zur Berechnung der serialVersionUID variiert von einer JRE zur anderen. Es ist auch möglich, dass die Umgebung, in der das Objekt serialisiert wird, eine JRE verwendet (z.B. SUN JVM) und die Umgebung, in der die Deserialisierung stattfindet, eine Linux Jvm(zing) verwendet. In solchen Fällen unterscheidet sich die serialVersionUID, die dem serialisierten Objekt zugeordnet ist, von der serialVersionUID der Klasse, die in der Deserialisierungsumgebung berechnet wurde. Die Deserialisierung wird dann nicht erfolgreich sein. Um solche Situationen/Probleme zu vermeiden, muss der Programmierer also immer die serialVersionUID der serialisierbaren Klasse angeben.

2 Stimmen

Der Algorithmus variiert nicht, ist aber etwas unterspezifiziert.

0 Stimmen

... der Algorithmus variiert nicht, aber er ist etwas unterspezifiziert ... was bedeutet, dass jeder jvm variieren kann..... @user207421

20voto

Henrique Ordine Punkte 3177

Ein Beispiel, bei dem die fehlende serialVersionUID ein Problem darstellen könnte:

Ich arbeite an dieser Java EE-Anwendung, die aus einem Webmodul besteht, das eine EJB Modul. Das Webmodul ruft das EJB Modul ferngesteuert und übergibt eine POJO die Folgendes implementiert Serializable als Argument.

Diese POJO's Klasse wurde in das EJB-Jar und in ein eigenes Jar in der WEB-INF/lib des Webmoduls gepackt. Sie sind eigentlich die gleiche Klasse, aber wenn ich das EJB-Modul verpacke, entpacke ich das Jar dieses POJOs, um es zusammen mit dem EJB-Modul zu verpacken.

Der Aufruf der EJB schlug mit der unten stehenden Exception fehl, weil ich nicht deklariert hatte, dass die serialVersionUID :

Caused by: java.io.IOException: Mismatched serialization UIDs : Source
 (Rep.
 IDRMI:com.hordine.pedra.softbudget.domain.Budget:5CF7CE11E6810A36:04A3FEBED5DA4588)
 = 04A3FEBED5DA4588 whereas Target (Rep. ID RMI:com.hordine.pedra.softbudget.domain.Budget:7AF5ED7A7CFDFF31:6227F23FA74A9A52)
 = 6227F23FA74A9A52

18voto

grand johnson Punkte 711

Machen Sie sich keine Mühe, die Standardberechnung ist wirklich gut und reicht für 99,9999% der Fälle aus. Und wenn Sie auf Probleme stoßen, können Sie - wie bereits erwähnt - bei Bedarf UIDs einführen (was höchst unwahrscheinlich ist).

5 Stimmen

Blödsinn. Es ist ausreichend, wenn sich die Klasse nicht geändert hat. Sie haben keinerlei Beweise für die Behauptung "99,9999 %".

1 Stimmen

Das Problem ist nicht, dass es nicht "gut" ist, sondern dass es nicht garantiert ist, dass es über verschiedene Versionen hinweg konsistent ist.

1 Stimmen

Ohne serialVersionUID werden Sie immer auf Probleme stoßen, wenn Sie eine Klasse ändern müssen, die mit ihrer Serialisierung abwärtskompatibel bleiben muss.

18voto

Archimedes Trajano Punkte 28004

Ich verwende im Allgemeinen serialVersionUID in einem Kontext: Wenn ich weiß, dass sie den Kontext der Java VM verlassen wird.

Ich würde dies wissen, wenn ich die ObjectInputStream y ObjectOutputStream für meine Anwendung oder wenn ich weiß, dass eine Bibliothek/ein Framework, das ich verwende, es verwenden wird. Die serialVersionID stellt sicher, dass verschiedene Java VMs unterschiedlicher Versionen oder Hersteller korrekt zusammenarbeiten, oder wenn sie außerhalb der VM gespeichert und abgerufen wird, z. B. HttpSession können die Sitzungsdaten auch bei einem Neustart und Upgrade des Anwendungsservers erhalten bleiben.

Für alle anderen Fälle verwende ich

@SuppressWarnings("serial")

da die meiste Zeit der Standard serialVersionUID ist ausreichend. Dies umfasst Exception , HttpServlet .

0 Stimmen

HttpServlet in Containern, wo sie ausgetauscht werden können, oder Exception in RMI zum Beispiel sind nicht enthalten.

15voto

Mukti Punkte 271

Felddaten stellen einige in der Klasse gespeicherte Informationen dar. Die Klasse implementiert die Serializable Schnittstelle, daher bot eclipse automatisch an, die serialVersionUID Bereich. Beginnen wir mit dem dort eingestellten Wert 1.

Wenn Sie nicht wollen, dass diese Warnung kommt, verwenden Sie dies:

@SuppressWarnings("serial")

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X