Was ist eine SerialVersionUID?

Eine SerialVersionUID ist eine Zahl vom Typ long, die zur eindeutigen Identifikation der Version einer serialisierbaren Klasse dient.

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.

Serialver GUI

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