Serialisierung - Sinn einer generierten serialVersionUID?

equin

Aktives Mitglied
Hallo,

mal eine kurze Frage, wenn ich in eclipse eine Klasse erstelle, die das Interface "Serializable" implementiert, zeigt mir eclipse eine Warnung und schlägt mir vor, eine default serial id (-> 1) hinzuzufügen oder eine zu generieren (e.g: 5962860443947554150L).

Da dies ja eine Art Versionsnummer ist macht es für mich eigentlich nur Sinn bei 1 anzufangen und dann neuere Versionen hochzuzählen?

Gibt es einen logischen Grund für eine generierte serial id?

Viele Grüße
equin
 
Ich glaube der Sinn dahinter ist, dass deine Klasse 100%ig eindeutig wird (mit der 1L würde sie das ja nicht) damit sie Serialisiert und auch wieder deserialisiert werden kann.

Bin mir da aber nicht ganz sicher.
 
Hi,

Das macht nur dann Sinn, wenn es die egal ist.

Das kann genau dann sein, wenn sich diese klasse niemals ändert. Oder Änderungen so implementiert sind, dass die kalsse sich nicht ändert; eG hashmaps als datenhaltung.

Aber du hast recht. Sinniger ist bei eins anzufangen. Wenn sich die klasse ändert hochzählen. Damit sagst du alle alten serialisierunfen sind ungültig.


Gruß Martin.
 
Warum generieren und nicht 1L? In einem bestimmten Szenario macht das Sinn:
- Du hast bereits eine Serializable-Klasse ohne explizite serialVersionUid
- Du hast gelesen, dass es besser ist, diese explizit zu deklarieren und willst das jetzt nachholen
- Du willst das so tun, dass Deine Klasse kompatibel zur Version ohne explizite serialVersionUid ist
Dann rufe die generate-Funktion auf. Die führt die Berechnung nämlich genau so durch, wie die VM es machen würde, wenn es keine gäbe. Damit würde ein Vergleich der beiden Werte (dynamisch von VM berechnet bei Version ohne expliziten Wert zu der Version, wo Du diesen Wert explizit angegeben hast) true ergeben und die beiden Versionen wären kompatibel.

Ansonsten würde ich zu 1L, 2L, 3L ... raten.
 
die generierte Id ist kein Zufallswert, sondern aus den Feldern/ Code berechnet

ein Punkt zumindest, der mir gerade bei einer Suche auffiel:
wenn man bereits Objekte serialisiert hat ohne Id bisher und die Klasse ändert,
aber die alten gespeicherten Objekte noch verwenden will, dann kann man sich zum alten Zustand die Id erzeugen, auf die man selber ja nie käme, und es funktioniert gerade noch

allerdings ein recht konstruierter Fall, da könnte man auch gleich die Klasse unverändert/ zurückgeändert verwenden um die Objekte nur zu laden und anders zu speichern..
 

Zurück
Oben