Serialisierung: Klassen-Update

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Serialisierung: Klassen-Update

    Moin.

    Ich probiere derzeit, Daten zu speichern, indem ich die Klassen serialisiere und in einer Datei abspeichere.
    Wenn ich die Klasse aber änder, kann ich die alten Objekte nicht mehr laden.
    Fehlermeldung:
    Exception in thread "main" java.io.InvalidClassException: library.school.Language; local class incompatible: stream classdesc serialVersionUID = -2738708014350545579, local class serialVersionUID = 610895515635440888
    at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:579)
    at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1600)
    at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1513)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1749)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1346)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:368)
    at java.util.ArrayList.readObject(ArrayList.java:696)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:616)
    at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:991)
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1865)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1770)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1346)
    at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1963)
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1887)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1770)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1346)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:368)
    at library.school.LanguageContainer.load(LanguageContainer.java:48)
    at library.school.LanguageContainer.getInstance(LanguageContainer.java:36)
    at Test.LangugeTest.main(LangugeTest.java:20)
    Java Result: 1
    Das würde bedeuten, dass die Benutzer der Software bei jedem Update alle Daten verlieren würden ^ ^.
    Gibt es dafür eine Lösung?

    Gruß,
    SargTeX

    P.S.: Die Objekte werden folgendermaßen geladen & gespeichert:

    Quellcode

    1. //load
    2. FileInputStream fileIn = new FileInputStream("dateiname.data");
    3. ObjectInputStream objectIn = new ObjectInputStream(fileIn);
    4. Klassenname instance = (Klassenname) objectIn.readObject();
    5. //save
    6. FileOutputStream fileOut = new FileOutputStream("dateiname.data");
    7. ObjectOutputStream objectOut = new ObjectOutputStream(fileOut);
    8. objectOut.writeObject(this);
    9. objectOut.close();
  • Nein, gar nicht^ ^.
    Wie muss ich das denn machen bzw. was bringt das?

    Habe gerade gelesen, dass man auch eine eigene Klassen-Version hinterlegen kann:

    Quellcode

    1. // code
    2. import java.io.Serializable;
    3. public class Zed implements Serializable {
    4. private double value;
    5. private static final long serialVersionUID = 4;
    6. public double getValue() {
    7. return this.value;
    8. }
    9. public void setValue(double value) {
    10. this.value = value;
    11. }
    12. }
    Alles anzeigen



    Bei obiger Klasse wäre die Version nun immer 4.

    Quelle: zdnet.de/anwendungsentwicklung…y-20000201-41000161-1.htm
  • Genau, serialVersionUID muss immer überschrieben, genauso wie hashCode und equals. Den hashCode brauchst du meistens wenn du es in hashMaps reinpackt, ich kann mir aber vorstellen dass Java den auch benutzt um zwei Objekte nach dem deserialisieren zu vergleichen.
    ~ mfg SeBa

    Ich beantworte keine PMs zu Computer-/Programmierproblemen. Bitte wendet euch an das entsprechende Forum.

    [Blockierte Grafik: http://i.creativecommons.org/l/by-sa/3.0/80x15.png]