Fragen zum Serializable-Interface



  • Hi Leute,

    ich habe folgendes Problem:

    Im Moment benutze ich das Serializalbe-Interface um meine Objekte in eine Datei zu schreiben. Jedes mal, wenn ich die Klasse verändere (z.B. eine Member-Variable zu der entsprechenden Klasse hinzufüge), können die DateN nicht mehr eingelesen werden und es wird eine Exception geworfen.

    Früher oder später muss die Klasse aber an die neuen Gegebenheiten angepasst werden. Wäre es sinnvoll für diese selbst definierte Klasse eine eigene Save-Methode zu schreiben, die das Speichern bis auf die "elementaren" Datentypen bzw. Klassen, wie Integer runterbricht? Kommt es auch zu einer Serializable-Exception, wenn sich in der nächsten Java-Version etwas an der Integer-Klasse ändert?

    Danke im Voraus!

    MfG
    WilMen



  • WilMen schrieb:

    Hi Leute,

    (z.B. eine Member-Variable zu der entsprechenden Klasse hinzufüge), können die DateN nicht mehr eingelesen werden und es wird eine Exception geworfen.

    zumindest das kannst du durch explizites hinzügen der version verhindern:

    private static final long serialVersionUID = 1L;
    

    ansonsten wird bei jeder kleinsten änderung ein neuer defaultwert von dieser variable gebildet und die klassen sind nicht mehr kompatibel.
    neu hinzugekommende variablen werden einfach mit null initialisiert.
    bei groben eingriffen wie entfernen oder typänderung werfen dann dennoch eine exception.

    es gibt sicherlich noch möglichkeiten über selbst definierte writeObject und readObject methoden oder ähnliches aber ich bin leider kein experte auf dem gebiet - weiß nur dass es sehr schnell sehr kompliziert werden kann. und weiche persönlich lieber auf json oder xml aus.



  • ver hat Recht, readObject und writeObject sind der richtige Weg. Allerdings ist Serialization ein sprachexterner Mechanismus, mit dem man sehr vorsichtig umgehen muss (z.B. Singletons und invarianten von Objekten zerschiesst man sich mit serializable recht schnell).

    Das gaengiste Pattern ist einen Serialization-Proxy zu verwenden.

    Ich wuerde dich in dem Zusammenhang auf Effective Java verweisen, darin wird das Thema sehr gut behandelt http://www.amazon.com/Effective-Java-2nd-Joshua-Bloch/dp/0321356683



  • Danke für eure Antworten 🙂 und entschuldigt das späte Antworten!

    MfG
    WilMen



  • Hey! 🙂

    @ver
    Ich habe es jetzt mal mit Hinzufügen der Variable "serialVersionUID" versucht und es funktioniert super! Anstelle von "1L" habe ich den Long-Wert mit dem im JDK enthaltenen Programm "serialver" erittelt, weil ich schon serialisierte Objekte hatte. Es ist wirklich Gold wert! Nun, kann ich endlich kleine Änderungen an den Klassen durchführen ohne die Objekte wieder neu zu erzeugen! Wunderbar, genau was ich gesucht habe! 🙂 Danke!

    @dineki89: Wenn ich an die Grenzen der oben genannten Variante stoße, werde ich mich auch noch mit den Proxys beschäftigen! Danke, schonmal für die Wegweisung! 🙂

    MfG
    WilMen


Anmelden zum Antworten