C# Deserialisierung

Gast #2404696
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
Gast #2404698
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.
Gast #2404862
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.
Gast #2406187
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren