Hallo alle zusammen, folgendes Problem habe ich bei der Deserialisierung. Beispielhaft die Klasse die serialisiert wurde. [Serializable()] public class Test { public ushort[] Daten { get; set; } public ushort Var1 { set Daten[0]=value; get return Daten[0]; } public ushort Var2 { set Daten[1]=value; get return Daten[1]; } public DspSteuerung() { this.Daten = new ushort[2] } } Diese Klasse liegt mir serialisiert in einer .bin Datei vor. Zwischenzeitlich wurde aber die Klasse erweitert mit folgenden Änderungen: Array vergrößert: this.Daten = new ushort[4]; Zwei zusätzliche Felder (Var3 und Var4) Beim Deserialisieren der alten .bin Datei mit der neuen erweiterten Klasse bekomme ich folgende Fehlermeldung (System.IndexOutOfRangeExeption) Diese Fehlermeldung tritt bei den Feldern Var3 und Var4 auf (Die es ja bei der alten Klasse noch nicht gegeben hat) Die Ursache ist das das Array der alten Klasse zu klein ist. Aber wie bekommt man die Sache in den Griff wenn man die Daten des alten Objekt benötigt Ich hoffe man versteht bei meiner Beschreibung wo das Problem liegt
serialisierung/deserialisierung ist nicht als permanenter datenspeicher gedacht sondern eigentlich nur um objekte über eine leitung zu schicken. das "layout" der klasse darf sich zwischen serialisierung und deserialisierung nicht ändern. > Aber wie bekommt man die Sache in den Griff wenn man die > Daten des alten Objekt benötigt die alten daten mit dem alten klassenlayout deserialisieren.
Und wie realisiere ich dann einen Parameterdatenspeicher? Leider ist dieser Parameterspeicher schon auf Grundlage der Serialisierung umgesetzt!
Die Serialisierung sollte sich eigentlich schon als permanenter Datenspeicher eignen. Der Fehler ist das das Array Daten zu klein angelegt wurde! Hier hätte ich besser this.Daten = new ushort[4096] machen sollen
es kommt darauf an welche art daten du speichern möchtest. wenn du unbedingt am serialisieren (mit den jetzt entdeckten nachteilen) festhalten möchtest, dann würde ich zumindest den xmlformatter und nicht den binaryformatter verwenden, dann kann man zur not immernoch mit dem texteditor gerade biegen und man kann die eigenschaften der klasse auch mit attributen gefügiger machen. Martin schrieb: > Kann man sowas mit ISerializable geradebiegen? bedingt. ich bin mir nicht sicher ob das interface nicht schon beim serialisieren implementiert sein muss.
wie schon geschrieben, mit alter klasse deserialisieren, in neue klasse kopieren, serialisieren, fertig.
Hab dein Stück Code und etwas Serialisierung (BinaryFormatter) grad mal ausprobiert, kann deinen Fehler aber leider nicht reproduzieren. Kannst du vielleicht etwas minimal Lauffähiges zum Testen posten?
Hallo ich habe das Problem heute lösen können und zwar so: (War doch ganz leicht) Neue Klasse: [Serializable()] public class Test { public ushort[] Daten { get; set; } public ushort[] DatenNeu { get; set; } public ushort Var1 { set Daten[0]=value; get return Daten[0]; } public ushort Var2 { set Daten[1]=value; get return Daten[1]; } public ushort Var3 { set DatenNeu[0]=value; get return DatenNeu[0]; } public ushort Var4 { set DatenNeu[1]=value; get return DatenNeu[1]; } public DspSteuerung() { this.Daten = new ushort[2]; this.DatenNeu = new ushort[2]; } } Man darf nur nicht versuchen im nachhinein die größe des Arrays zu ändern. Ansonsten stellt das hinzufügen neuer Propertys keine Probleme dar.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.