Serial Version ID?

nrg

Top Contributor
Hallo Zusammen,

ich hab mich jetzt schon öfters gefragt, was die Entwicklungsumgebung Eclipse mir damit sagen will:

unbenannt6q6b.jpg


Was ist die Serial Version ID und warum soll man die als konstantes Attribut reinnehmen?

Danke und Grüße
andi
 

nrg

Top Contributor
achso, weil die Klasse Vector das Interface Serializable implementiert, ich damit Objekte vom typ Telefonbuch speichern könnte und dazu dann eine Seriennummer für die Klasse bräuchte??
 

The_S

Top Contributor
erste zwei Teile: ja, letzter Teil ("Seriennummer für die Klasse bräuchte") nein, du brauchst die Nummer nicht, sie ist nur zu empfehlen (steht auch in dem Artikel).
 
M

maki

Gast
Wobei sich die Geister scheiden ob es wirlich empfehlenswert immer ist eine SUID zu haben, denn dann geht man davon aus, zwischen verschiedenen Verisonen zu de-/serialisieren, und ich glaube das haben nur die wenigsten vor ;)
Für alle anderen ist die SUID gefährlich.
 
S

Spacerat

Gast
Also ich sag' mal: Wenn die IDE vor einer fehlenden SUID warnt, sollte man diese auch einfügen, denn wenn von der JVM keine gefunden wird, wird diese aufgrund des Bytecodes stets neu berechnet und afaik werden dazu auch Member herangezogen, die nicht serialisiert werden sollten (transient). Wenn die Klasse niemals zum Serialisieren gedacht ist, sollte man "1L" nehmen. Ansonsten lässt man eine SUID von der IDE berechnen und ändert diese in der Entwicklungsphase nicht mehr, solange sich am Serialisierungsvorgang nichts ändert (z.B. neuer Member soll serialisiert werden). Solange nur Methoden oder trantsistente Member der Klasse hinzugefügt oder geändert werden bleibt die einmal berechnete SUID gültig (im Gegensatz zur von der JVM stets neu berechneten). So können dann auch Objekte einer früheren Version in die neue Klasse deserialisiert werden. Diese Objekte sind also erst dann verloren, wenn sich der Serialisierungsvorgang geändert hat.
@maki: Dagegen, das es die wenigsten vorhaben, spricht, dass es sich meistens gar nicht vermeiden lässt.
 
Zuletzt bearbeitet von einem Moderator:

The_S

Top Contributor
Hm, also ich teile da eher die Meinung von maki. Wer serialisiert schon sein JFrame ;) . Und bevor nur das sinnlose 1L angegeben wird, bevorzuge ich die Annotation [c]@SuppressWarnings("serial")[/c]
 
S

Spacerat

Gast
Nun ja... Wenn ich ehrlich sein soll, hast du bei AWT-/Swing-Componenten irgendwie Recht. Es hätte genügt, wenn Applets nur serialisierbar gewesen wären. Aber was bitte ist am "1L" denn sinnlos? "SupressWarnings" zeugt nicht gerade von gutem Programmierstil und "1L" ist immerhin noch besser als von Kompilat zu Kompilat neu berechnet. Standard halt. Was solls... jedem das Seine.
 

nrg

Top Contributor
ok danke für die information :). hab jetzt zumindest verstanden wie man damit umzugehen hat. leider noch nicht ganz warum und für was die jvm diese komische seriennummer beim speichern von objekten braucht aber damit muss ich mich wohl mal genauer befassen, wenn ich das vorhabe. bis dahin werd ich halt immer, wenn die entwicklungsumgebung meckert den std von "1L" einfügen ;).
grüße
 

tfa

Top Contributor
Ich würde wie the_S auch eher zu SuppressWarnings raten. "1L" halte ich für schlechten Stil. Wenn man eine UID angibt, bedeutet das für mich, dass man die Klasse serialisieren will. Ein "1L" würde ich dann eher für eine Unachtsamkeit halten, als schlecht gewählten Defaultwert. Die SuppressWarnings-Annotation ist ja nur eine Art Kommentar. Sie zeigt, dass man verstanden hat, dass hier eine Serialisierung möglich wäre, man sich aber sicher ist, sie niemals durchzuführen. Vielleicht sollte man zusätzlich noch einen richtigen Kommentar dazu schreiben. Aber überall nur "1L" hinzuknallen ist Murks.
 
M

maki

Gast
Wenn man eine UID angibt, bedeutet das für mich, dass man die Klasse serialisieren will.
Wenn man eine SUID angibt, bedeutet das: Man kann Objekte zwischen verschiedenen Klassenversionen de-/serialisieren und die Anwendung ist dafür ausgelegt... da ist ein großes Risiko mit verbunden ;)

Es ist ganz und gar kein guter Stil immer eine SUID zu haben, besonders wenn man eben nicht zwischen verschiedenen Versionen de-/serialisieren will, die Gefahr sollte selbsterklärend sein ;)

Leider hat Eclipse das in den Standardeinstellungen, und somit halten Leute es für eine gute Sache, obwohl sie es nicht ist.
Wenn ich keine SUID angebe, wird bei jedem kompilieren eine neue erzeugt, und ich merke garantiert falls ich verschiedene Versionen der Klassen habe :)

Wenn man also nur Objekte zwischen gleichen Verisonen der Klasse de-/serialisieren will, sollte man auf jedenfall keine SUID vergeben und der Compiler & die Laufzeitumgebung stellen sicher dass das so bleibt, das ist der Standardfall.
 

tfa

Top Contributor
Wenn man eine SUID angibt, bedeutet das: Man kann Objekte zwischen verschiedenen Klassenversionen de-/serialisieren und die Anwendung ist dafür ausgelegt...
Richtig, das sind darüber hinaus die technischen Auswirkungen, ich meinte eher die Intention des Entwicklers (d.h. wenn man die abgeleitete JComponent niemals in einen Object-Stream steckt, ist die Gefahr eines Versionskonflikts eher gering ;) )
 

fastjack

Top Contributor
@maki Du sprichst mir aus dem Herzen.
@spacerat private static und private transient wird NICHT in die Berechnung der SerialVersionUID mit einbezogen.
@all Im Internet gibt es leider viele mißverständliche bzw. auch falsche Auslegungen der Berechnung und Verwendung dieses Identifikators. Man sollte lieber den Spezifikationen von SUN vertrauen.

Persönlich bevorzuge ich die automatische Berechnung, da bei allem was man selber einstellen muß, sich naturgemäß irgendwann die Routine(Faulheit) einschleicht und man das hochrechnen dieser Zahl einfach irgendwann vergißt. Das passiert bestimmt nicht bei zwei oder drei Klassen, bei 200 aber bestimmt.
Zudem bin ich bei RMI-Programmierung eigentlich selten böse überrascht worden, außer wenn ich an der Grundstruktur der Objekte etwas verändert hatte. Da die Serialisierung aber größtenteils zum Client-Server Datenaustausch genutzt werden sollte, ist bei einer Strukturveränderung ein Clientupdate eigentlich sinnvoll.
Wenn man aber seinen gesamten Datenbestand serialisiert auf Platte speichert, kann man sich bei einer Strukturveränderung eigentlich nur noch in den Kopf schießen :) aber wozu gibt Datenbanken und XML ?
 
S

Spacerat

Gast
Wenn man eine SUID angibt, bedeutet das: Man kann Objekte zwischen verschiedenen Klassenversionen de-/serialisieren und die Anwendung ist dafür ausgelegt... da ist ein großes Risiko mit verbunden ;)

Es ist ganz und gar kein guter Stil immer eine SUID zu haben, besonders wenn man eben nicht zwischen verschiedenen Versionen de-/serialisieren will, die Gefahr sollte selbsterklärend sein ;)

Leider hat Eclipse das in den Standardeinstellungen, und somit halten Leute es für eine gute Sache, obwohl sie es nicht ist.
Wenn ich keine SUID angebe, wird bei jedem kompilieren eine neue erzeugt, und ich merke garantiert falls ich verschiedene Versionen der Klassen habe :)

Wenn man also nur Objekte zwischen gleichen Verisonen der Klasse de-/serialisieren will, sollte man auf jedenfall keine SUID vergeben und der Compiler & die Laufzeitumgebung stellen sicher dass das so bleibt, das ist der Standardfall.
Naja... Wenn ich es mir recht überlege, ist da durchaus was dran. Vor allem dass man bei definierter SUID (bis auf eine Exception beim deserialisieren) gar nicht mehr merkt, das zwischen verschiedenen Versionen serialisiert wurde. Aber es ist doch eine Empfehlung von Sun, sie zu definieren. Darf man sich inzwischen schon aussuchen, an welche Konventionen man sich hält oder nicht? Mir geht diese Warnung im übrigen auch auf den Sender. Vorallem, wenn die Klasse niemals zum serialisieren gedacht ist. Was ich aber viel haarsträubender finde, ist, jemals irgendwo Warnungen unterdrücken zu müssen ([OT]... das geht mal direkt an GENERICS ;)[/OT]). Da fragt man sich manchmal früher oder später, warum genau dort etwas unterdrückt werden musste und ob es nicht anders geht. Das gilt nicht nur für Java.
 
M

maki

Gast
Aber es ist doch eine Empfehlung von Sun, sie zu definieren. Darf man sich inzwischen schon aussuchen, an welche Konventionen man sich hält oder nicht?
Ist leider nicht das erste mal dass man die Empfehlung von Sun ignorieren sollte, zB. in JPA 1.0 wurde empfohlen die Annotationen an die Getter/Setter zu machen, was auch quatsch ist und in JPA 2.0 korrigiert wurde, was aus J2EE geworden ist brauche ich ja nciht mehr zu erwähnen, mittlerweile orientieren sich die in einigen Punkten stark an Spring.

Das ist übrigebns nicht auf meinem Mist gewachsen, hab's aus Robert .C "Uncle Bob" Martins Buch "Clean Code" ;)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
ff eclipse ::--> serial version uid Java Basics - Anfänger-Themen 8
B Serial port abfragen Java Basics - Anfänger-Themen 18
B Serial Key prüfen -> String mit privatem Key und dann abgleichen; Summe = 0 Java Basics - Anfänger-Themen 8
B Serial Key - Prüfung ob Software gekauft Java Basics - Anfänger-Themen 1
I Serial Key speichern? Java Basics - Anfänger-Themen 8
E Programm - Serial etc? Java Basics - Anfänger-Themen 4
G @SuppressWarnings("serial") Java Basics - Anfänger-Themen 2
H Serial Java Basics - Anfänger-Themen 5
P Neue Java v8 JRE Version nicht über alte drüber installierbar: Wie sonst? Java Basics - Anfänger-Themen 7
A Eclipse IDE - Wie bekomme ich eine ältere Version Java Basics - Anfänger-Themen 6
Zrebna Umgebungsvariable Wieso wird meine verwendete JDK-Version in der Prompt nicht erkannt? Java Basics - Anfänger-Themen 6
M Java Version Verständnisfrage Java Basics - Anfänger-Themen 16
J Welche Java-Version installieren Java Basics - Anfänger-Themen 9
pkm Eclipse wie mit anderer JAVA-Version starten? Java Basics - Anfänger-Themen 1
U duplicate entry: Version.java.template Java Basics - Anfänger-Themen 0
N Javac -version der Befehl ist entweder falsch geschrieben oder...... Java Basics - Anfänger-Themen 8
J class version 52 und 56 Java Basics - Anfänger-Themen 6
U UnsupportedClassVersionError trotz neuster JRE und JDK Version Java Basics - Anfänger-Themen 7
dapzoo Class File Version zu niedrig? Ausführen über Eingabeaufforderung nicht möglich Java Basics - Anfänger-Themen 14
I Richtige Java-Version finden? Java Basics - Anfänger-Themen 17
J Windows Version herrausfinden Java Basics - Anfänger-Themen 3
P Javaprogramm mit einer bestimten Version starten Java Basics - Anfänger-Themen 5
A Erste Schritte Programm in Shell mit bestimmter Java-Version aufrufen Java Basics - Anfänger-Themen 10
B Netbeans Java Version 8.0.2 und Yosemite Java Basics - Anfänger-Themen 1
G Welche Java-Version auf meinem Rechner? Java Basics - Anfänger-Themen 2
H JDK installieren Ältere Version besorgen Java Basics - Anfänger-Themen 2
H java version updaten Java Basics - Anfänger-Themen 11
K Welche Java Version ist die richtige Java Basics - Anfänger-Themen 3
M System.getProperty("java.vm.version") liefert build-Version Java Basics - Anfänger-Themen 4
M Java 64 bit version funktoniert nicht bei win 64 bit Java Basics - Anfänger-Themen 6
J Kompilieren in anderern Java-Version? Java Basics - Anfänger-Themen 15
T Compiler-Fehler Version nicht aktuell? Java Basics - Anfänger-Themen 8
L Problem, Backslash einzugeben - Version? Java Basics - Anfänger-Themen 11
S Multi Threaded Version langsamer als normale Version Java Basics - Anfänger-Themen 41
D Letztes Änderungs-Datum als Version automatisch eintragen Java Basics - Anfänger-Themen 5
M JDK installieren Compiler Version Java Basics - Anfänger-Themen 4
K kan 64Bit Version unter Win7Pro64 nicht installieren Java Basics - Anfänger-Themen 12
Kukulkan Java-Version (ME, SE) erkennen und darauf reagieren? Java Basics - Anfänger-Themen 35
S Falsche Version? Java Basics - Anfänger-Themen 2
K JDK-Version einer kompilierten Java-Klasse? Java Basics - Anfänger-Themen 6
agent47 Java Version vergleichen Java Basics - Anfänger-Themen 6
G Java Version steuern Java Basics - Anfänger-Themen 12
R Java Version herausfinden..? Java Basics - Anfänger-Themen 1
X Java Eclipse Version: 3.4.1 meldet manchmal keine Fehler Java Basics - Anfänger-Themen 17
K Problem beim installieren des JDK 1.6+ version Java Basics - Anfänger-Themen 3
G java version umstellen von 1.4 auf 1.6 unter linux Java Basics - Anfänger-Themen 4
A brauche eine Lösung für Problem bei Moorhuhn-Version Java Basics - Anfänger-Themen 5
J Wie in Windows Installation und Version von Java ermitteln? Java Basics - Anfänger-Themen 2
G Welche Version zuerst? Java Basics - Anfänger-Themen 11
mwildam Welche Java-Version (SE oder EE)? Java Basics - Anfänger-Themen 9
D Java-Version anzeigen lassen Java Basics - Anfänger-Themen 4
G Version von Anwendung mit Eclipse oder anders festlegen Java Basics - Anfänger-Themen 8
G Mailversand mit Java in der Version 1.3? Java Basics - Anfänger-Themen 2
H java.lang.UnsupportedClassVersionError: Bad version number Java Basics - Anfänger-Themen 2
C JVM-Version ermitteln Java Basics - Anfänger-Themen 4
G falsche Version Java Basics - Anfänger-Themen 3
M java version auslesen Java Basics - Anfänger-Themen 3
K Anwendung mit anderer Java-Version Starten Java Basics - Anfänger-Themen 9
M Datei bei Class und Jar Version ladbar? Java Basics - Anfänger-Themen 2
G Version auslesen Java Basics - Anfänger-Themen 6
U Riesen Problem - unsupported major.minor version 49.0 Java Basics - Anfänger-Themen 5
H Java Version 5.0 Java Basics - Anfänger-Themen 6
F java version prüfen Java Basics - Anfänger-Themen 9
S JDK-Version auslesen Java Basics - Anfänger-Themen 3
B Frage zur Applet-Version von CoolStrip Java Basics - Anfänger-Themen 9

Ähnliche Java Themen

Neue Themen


Oben