Was ist eine SerialVersionUID?
Eine SerialVersionUID wird als Versionsnummer bei der
Serialisation automatisch jeder Klasse hinzugefügt, die das
Interface Serializable
implementiert. Sie ist vom Typ long
,
kann vom Entwickler selbst deklariert werden und muss dann als static
final
ausgezeichnet werden. Der Zugriffsmodifikator private
ist nicht vorgeschrieben, aber empfehlenswert. Zur Berechnung einer
SerialVersionUID werden die Elemente der Klasse der zu
serialisierenden Objekte (Felder, Methoden, Konstruktoren, etc.)
hinzugezogen.
Bei der Deserialisierung wird die ID verwendet um sicherzustellen, dass der Empfänger des serialisierten Objektes die zur Deserialisation passenden Klassen und Objektstrukturen aufweist. Auf diese Weise werden Inkompatibilitäten vermieden, die auftreten können, falls sich nach dem Speichern des serialisierten Objektes die Struktur der ladenden Klasse gegenüber der ursprünglichen Version geändert haben sollte. Insofern ist sie vor Allem bei der dauerhaften Speicherung und anschließenden Deserialisierung von Objekten notwendig.
Die explizite Deklaration einer SerialVersionUID wird für alle Klassen dringend empfohlen1), für die eine Serialisierung in Betracht gezogen wird, da die automatische Erzeugung durch die Serialisierungsumgebung ausgesprochen sensibel auf unterschiedliche Compilerversionen reagiert. Gegebenenfalls kann somit bereits die Kompilation einer neuen Version mit einem abweichenden Compiler zu unerwarteten Versionskonflikten bei der Deserialisierung führen.
Erzeugung einer SerialVersionUID
serialver
Das JDK enthält das Konsolen-Programm serialver
,
das zur Ermittlung der SerialVersionUID
einer
serialisierbaren Klasse dient. Es kann zur Berechnung und Ausgabe
der ID auf der Konsole oder mit einer einfachen GUI verwendet
werden.
Im ersten Fall ist der voll qualifizierte Name der
kompilierten Klasse mit Angabe des Klassenpfades (classpath)
aufzurufen. Das folgende Beispiel gilt für eine kompilierte
Klasse, die sich im Eclipse-workspace und dort im bin
-Verzeichnis
des Projektes Javabeginners befindet.
Eric:~ joecze$ cd ~/Documents/workspace_4.4/Javabeginners Eric:Javabeginners joecze$ serialver -classpath bin einUndAusgabe.serialization.GenerateUUID einUndAusgabe.serialization.GenerateUUID: private static final long serialVersionUID = 8582433437601788991L; Eric:Javabeginners joecze$
Möchte man das GUI verwenden, so ruft man serialver
mit dem Schalter -show
auf. Hierbei muss zwar ggf. der
Klassenpfad per -classpath
angeführt, die Klasse
selbst jedoch darf nicht mit genannt werden.
Sollte in der serialisierbaren Klasse bereits eine abweichende ID
deklariert sein, so muss diese bei der Verwendung von serialver
auskommentiert werden, da das Programm in diesem Fall die
deklarierte ID zeigt, anstatt eine passende zu berechnen.
Eclipse
In der Grundeinstellung zeigt Eclipse eine Warnung in Form einer
gelben Unterstreichung des Klassenbezeichners an, falls in einer
Klasse, die das Interface Serializable
implementiert,
keine serialVersionUID
deklariert ist. Durch Cmd
+ 1
wird ein Kontextmenü geöffnet, über das ein Feld mit der
ID erzeugt werden kann.
Möchte man die Warnung abstellen, so kann
dies über die Eclipse-Einstellungen
erfolgen.
Quellen
https://docs.oracle.com/javase/8/docs/platform/serialization/spec/class.html
1) siehe: https://docs.oracle.com/javase/8/docs/platform/serialization/spec/class.html#a4100
Wenn Ihnen javabeginners.de gefällt, freue ich mich über eine Spende an diese gemeinnützigen Organisationen.