ObjectOutputStream

  • Themenstarter Themenstarter Guest
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Hi,

ich arbeite gerade an einem Programm, dass Objekte mittels ObjectOutputStream in Dateien sichert.
Jetzt scheint es aber so zu sein, dass jedesmal wenn ich die Klasse ändere, die gesicherten Daten unbrauchbar weil nicht mehr einlesbar sind.

Ich habe daran gedacht, diesen Missstand zu umgehen, indem ich verschiedene Versionen der Klassen anfertige und die Version mitabspeichere, um danach die richtige Klassenversion zu laden.


Fällt jemandem eine bessere Lösung ein?
 
Frage: Benötigst denn wirklich das konkrete Objekt oder reicht auch ein Objekt, welches die gleichen Werte hat?

So könntest du beim sichern nur die Werte rausschreiben und beim wiederherstellen, erzeugst du dir ein neues Objekt und belegst alle Variablen mit den gesicherten Werten.
 
Wenn du selber einen UID (longWert) der Klasse mitgibst, dann bist Du selber verantwortlich was du in der Klasse änders, aber das Einlesen funkt, dann immer,
wenn du keine eigene UID mitgibst, dann wird eine berechnet für diese Klasse und wenn Du dann was änderst, dann stimmt das nicht mehr überein,
 
Ich brauch das konkrete Objekt, da diese mitunter so komplex und verschachtelt sind, das ein stückweises schreiben und einlesen viel zu umständlich wäre.

Wie funktioniert das mit der UID, also das ich die selber mitschreibe um die Klassen verändern zu können?
 
hast du bei den objekten, die gesichert werden sollen, das interface Serializable ausimplementiert?

...ist nur eine idee, da ich selber noch nie sowas gemacht habe. ich habe die nur über das netzwerk an die clients in meinem jConference genutzt, jedoch werden diese nicht in dateien abgelegt ;-)
 
Code:
public static final long serialVersionUID = 42L;
im eclipse kann man sich auch eine generieren lassen.
 
Und wenn ich die ins Objekt aufnehme gehts?

Oder was genau muss ich mit der dann machen?
 
die musst du in die klasse der objekte, die du über den objectoutputstream arbeiten lassen willst, einbauen.
 
achso, also diese VersionID quasi jedesmal wenn ich sie ändere erhöhen zum Beispiel, richtig?
 
also ich hab diese ID niemals angefasst... lass die doch einfach so und gib ein extra attribut "version" oder so.
 
Das versteh ich nicht, selbst wenn die VersionsID im gespeicherten Object steht, wie soll das dann nach einer Veränderung der Hauptklasse noch deserialisiert werden?

Wozu dient die ID eigentlich?
 
Jep, perfekter gehts nicht. Genau das was ich gesucht hab.

Nochmal vielen Dank an mikachu =)
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben