Serialisierung mit Versionen

  • Antworten:2
Luegisdorf
  • Forum-Beiträge: 14

01.06.2013, 16:06:22 via Website

Hallo wieder mal

Meine App speichert strukturierte Daten ein eine Datei. Die Daten sind als Membervariablen einer Klassenstruktur vorhanden. Ich verwende ich eine Se- und De-Serialisierung der Klasse.

Nun möchte ich aber für künftige Änderungen vorsorgen und die Daten versioniert abspeichern.

Das ganze habe ich eigentlich umgesetzt und zwar wird die ganze Klassenstruktur mit einem mehrfach verschachtelten Array des Typs Serializable[] gepackt und entpackt.

Leider ist vor allem das Entpacken extrem langsam. Wenn ich einfach alle Objekte (die natürlich das Serializable implementieren) in eine ArrayList packe und diese über ObjectIntputStream.readObject() geht das zack zack. An was kann das liegen?

Und was ich mich frage: Kann ich die Daten auch nach einem OS-Wechsel wieder lesen? Wie gesagt, 'meine' Struktur beinhaltet nur Serializable[Serializable[] oder int, oder String, oder Long] ...

Ich liebäugle, wieder die Standard-Serializierung zu verwenden und alles husch in eine ArrayList ... aber wie kann mein Programm aktiv darauf reagieren, wenn die Membervariablenliste geändert hat oder das OS/Plattformversion ändert? Ich habe zwar eine UID aber die sorgt standardmässig nur dafür, dass er merkt, dass das Objekt inzwischen nicht mehr erstellt werden kann ... weil eben die Struktur geändert hat.

Vielleicht kann mir ja jemand ein Codebeispiel machen, wie das mit dem reagieren von Änderungen in der Standardserialisation funktioniert:

Sagen wir, ich hätte folgende Klasse

class a implements Serializable
{
int i = 1;
String s = "bla";
static final long serialVersionUID = 1;
}

das pack ich dann ... und später

Antworten
Christian
  • Forum-Beiträge: 307

01.06.2013, 19:28:05 via Website

Hi Luegisdorf,

was meinst du mit:


Kann ich die Daten auch nach einem OS-Wechsel wieder lesen?

und

aber wie kann mein Programm aktiv darauf reagieren, wenn die Membervariablenliste geändert hat oder das OS/Plattformversion ändert?

mfg Christian

Antworten
Luegisdorf
  • Forum-Beiträge: 14

02.06.2013, 09:09:21 via Website

Sorry, irgendwie hat's den Post abgeschnitten .. aber ich hoffe ich kann's auf den Punkt bringen

Kann ich die Daten auch nach einem OS-Wechsel wieder lesen?
Nun, sagen wir, die interne Struktur einer Kernelklasse (z.B. ArrayList) ändert und ich hab noch eine 'alte' abgespeicherte Version. Das Objekt lässt sich wohl nicht mehr deserializieren, korrekt?

aber wie kann mein Programm aktiv darauf reagieren, wenn die Membervariablenliste geändert hat oder das OS/Plattformversion ändert?
Dito, wenn es eine eigene Klasse ist, oder?

Beispiel:
Membervariablen Klasse A in der Version 1:
int, int, String, int -> UID 1

das wird serialisiert und weggespeichert.

Später kommt ein Update für die App und Klasse A in Version 2 sieht nun so aus:
long, int, int, int, String, String -> UID 2

Nun soll das wieder deserialisert werden (und wenn möglich, neue Member mit einem Standardwert belegt werden).
Man beachte: Die Namen der 'alten' Membervariablen sind noch gleich, aber die Reihenfolge der Variablen hat sich geändert und es gibt neue sowie ein paar alte sind inzwischen verschwunden ....


Ich hoffe man vesteht, was ich meine.

Gruss & Danke

Antworten