Forum: PC-Programmierung C# Deserialisierung


von Martin (Gast)


Lesenswert?

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

von __tom (Gast)


Lesenswert?

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.

von Martin (Gast)


Lesenswert?

Und wie realisiere ich dann einen Parameterdatenspeicher?

Leider ist dieser Parameterspeicher schon auf Grundlage der 
Serialisierung
umgesetzt!

von Martin (Gast)


Lesenswert?

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

von Martin (Gast)


Lesenswert?

Kann man sowas mit ISerializable geradebiegen?

von __tom (Gast)


Lesenswert?

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.

von Frank M. (aktenasche)


Lesenswert?

wie schon geschrieben, mit alter klasse deserialisieren, in neue klasse 
kopieren, serialisieren, fertig.

von Tom E. (tkon)


Lesenswert?

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?

von Martin (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.