2016-09-19 6 views
0

Ich habe ein Config-Objekt, das ich in XML serialisiere, damit ich es später wieder laden kann. In meinem Konfigurationsobjekt habe ich ein WörterbuchXML-Deserialisierung von Listen

public Dictionary<int, FooConfiguration> Foos 
    { 
     get { return foos; } 
     set 
     { 
      if (foos != value) 
      { 
       foos = value; 
       OnPropertyChanged(() => foos); 
      } 
     } 
    } 

Objekte Wenn ich es bin Serialisierung scheint nicht Serialisierung Wörterbücher zu mögen, die ich verstehen kann, sie komplizierte Objekte sind. Als Workaround dachte ich, dass ich die Eigenschaft mit dekorieren und eine Liste meiner Objekte erstellen würde, die die Werte aus dem Wörterbuch erhalten würden.

public List<FooConfiguration> FooConfigurations 
    { 
     get { return Foos.Values.ToList(); } 
     set 
     { 
      int fooNumber = 0; 

      foreach (var fooConfiguration in value) 
      { 
       foos.Add(fooNumber++, fooConfiguration); 
      } 
     } 
    } 

Dies funktionierte so weit wie Serialisierung geht. Ich konnte diese Objekte jetzt in meinem XML sehen. Das Problem ist, dass es niemals den Setter traf. Warum könnte eine Liste serialisiert, aber nicht deserialisiert werden?

Ich habe schließlich behoben, indem Sie eine FooConfiguration[] anstelle einer Liste, aber das scheint ein bisschen komisch, wenn Sie mich fragen.

Wie Sie sehen können, habe ich eine Lösung, ich möchte nur wirklich verstehen, warum es tut, was es besser macht.

+0

Mögliche Duplikate von [Wie XML-Serialisierung eines Wörterbuchs] (http://stackoverflow.com/questions/3671259/how-to-xml-serialize-a-dictionary) –

+0

@JakubJankowski Danke dafür, Das ist ziemlich eine naheliegende Möglichkeit, ein Wörterbuch zu serialisieren und meiner Lösung ziemlich ähnlich zu sein. Während meine Hauptfrage ist, dass die Liste nicht deserialisiert wird, glaube ich nicht, dass es ein Duplikat ist. Vielleicht sollte ich den Titel ändern? – Keithin8a

+0

Verwenden Sie ein Array 'FooConfiguration []' anstelle einer 'List ' für Ihre Ersatzeigenschaft. Eine Erklärung dafür finden Sie unter [XML-Deserializer kann nicht in eine Liste deserialisiert werden] (https://stackoverflow.com/questions/26179792/cannot-deserialize-xml-into-a-list-using-xml-deserializer/26624551# 26624551) – dbc

Antwort

2

Wenn Ihre Liste einen Wert ungleich null hat, wird nicht benötigt, um den Setter zu treffen; es ruft nur Add auf der Liste auf, die es gegeben wird. Und in Ihrem Fall ist die Liste, die Sie es übergeben, von den tatsächlichen Daten losgelöst (weil Sie es im Getter erstellten).

Im Grunde ist es das Deserialisieren der Daten in ein Objekt, das auf dem Boden verbleibt.

+0

Danke, ich kann nicht glauben, dass ich nie darüber nachgedacht habe, es ist ziemlich offensichtlich, wenn du darüber nachdenkst. – Keithin8a

+0

@ Keithin8a die Absicht ist natürlich, die Zuweisung zusätzlicher Listen zu vermeiden; aber um fair zu sein, ist dieser Nebeneffekt ziemlich nuanciert –

+0

@ Keithin8a möglich fix: 'get {return (Foos == null || Foos.Count == 0)? null: Foos.Values.ToList(); } ' –

Verwandte Themen