serialVersionUID

reibi

Top Contributor
Hi

Ich hab mir mal sowas gebaut:

Java:
public abstract class GenericServlet extends HttpServlet { 
private static final long serialVersionUID = GenericServlet.generateNewUID();
...

und benutz das dann so:

Java:
public class MyServlet extends GenericServlet { ...

Dat Ding funktioniert prima ;-)

Nur will der in der Klasse "MyServlet" auch immer ne eigene "serialVersionUID" haben.
Warum wird n das nich vererbt?
und gibts ne Möglichkeit das zu vererben?


Gruss
 

inv_zim

Gesperrter Benutzer
Beim Serialisieren eines Objektes wird auch die serialVersionUID der zugehörigen
Klasse mit in die Ausgabedatei geschrieben. Soll das Objekt später deserialisiert
werden, so wird die in der Datei gespeicherte serialVersionUID mit der aktuellen
serialVersionUID des geladenen .class-Files verglichen. Stimmen beide nicht
überein, so gibt es eine Ausnahme des Typs InvalidClassException, und der
Deserialisierungsvorgang bricht ab.

(Quelle: Institut für Informatik)
 

reibi

Top Contributor
OK ... verstanden.

Und warum wird sowas nicht vererbt:

Java:
public abstract class GenericServlet extends HttpServlet { 
private static final long serialVersionUID = -3046507032255219296L;


Gruss
 

inv_zim

Gesperrter Benutzer
Da die SerialVersionUID eindeutig sein muss, um die Klassen bei deserialisieren wieder zuordnen zu können. Wenn alle vererbten Klassen die selbe SerialVersionUID haben, wird selbige ja witzlos, oder?
 
Zuletzt bearbeitet:
M

maki

Gast
Es wird vererbt(zwar nicht wirklich, aber immer noch sichtbar), aber das ist nicht der Punkt.

Bei der SerialUID geht es darum, dass jede Klasse ihre eigene haben sollte, zumindest ist das die Meinung von Eclipse.

Bist du dir sicher dass du verstanden hast worum es bei der Serial UID und der Eclipse Warnung geht? ;)
 

reibi

Top Contributor
Bei der SerialUID geht es darum, dass jede Klasse ihre eigene haben sollte, zumindest ist das die Meinung von Eclipse.

Und was ist der Grund "waum jede ein haben sollte?"
Ich meine nicht den Grund warum es eine solche SerialUID bei allen serialisierbaren Klassen baucht. Das ist übrigens klar.
egal ;-)


Bist du dir sicher dass du verstanden hast worum es bei der Serial UID und der Eclipse Warnung geht? ;)
Ja .. ist mir klar!

Aber grundsätzlich könnte doch auch die von der vererbten Klasse genommen werden - vor allem weil diese ja eh abstract ist und damit nicht initialisiert werden kann.

Gruss
 
M

maki

Gast
Eclipse ist der Meinung (default Einstellung) dass jede serialisierbare Klasse ihre eigene braucht, der Kompiler erzeugt einfach eine neue falls keine vorhanden ist.. was bedeutet dass dein Plan nicht funzen wird.

Ihmo fährt man in 99.9% der Fälle am besten mit der vom Kompiler erzeugten und die Eclipse default Warnung ist falsch.
 

fastjack

Top Contributor
Java:
public class StaticA {
    final static String PACKAGE_PRIVATE = "";
    private final static String PRIVATE = "";
    protected final static String PROTECTED = "";
    public final static String PUBLIC = "";

}

Java:
public class StaticB extends StaticA {
    public void foo() {
        System.out.println(PACKAGE_PRIVATE);
        System.out.println(PROTECTED);
        System.out.println(PUBLIC);
        System.out.println(PRIVATE); // compile error
    }
}

und wo ist da jetzt das Problem?
 

fastjack

Top Contributor
Okay, nicht direkt Vererbung aber StaticB hat nun Zugriff auf die Teile von StaticA, ohne sie zu referenzieren. Rein technisch sind es aber die Felder von StaticA.
 
M

maki

Gast
Sie werden zwar vererbt, aber können nicht wirklich überschrieben werden, nennt sich dann "shadowing", mit Polymorphy ist auch nix, kann Ärger machen ;)
 

Ähnliche Java Themen

Neue Themen


Oben