XML Deserialisierung der Sammlungseigenschaft mit Codestandards

Für die Anwendungskonfiguration erstelle ich häufig eine Konfigurationsklasse mit Konfigurationswerten für die Anwendung, die ich dann in ein zu verwendendes Objekt deserialisiere. Das Konfigurationsobjekt ist normalerweise an eine Benutzeroberfläche gebunden, sodass die Konfiguration vom Benutzer geändert und beibehalten werden kann. Der Konfigurationsklasse sind normalerweise Standardwerte für die Eigenschaften zugewiesen, sodass immer eine Standardkonfiguration vorhanden ist. Das hat gut funktioniert. Ich hatte vor kurzem eine Situation, in der ich eine Liste von Zeichenfolgen hatte, die einige Standardpfadinformationen lieferten. Und was ich sah, ließ mich erkennen, dass ich nicht genau wusste, wie die Objekteigenschaften während der XML-Deserialisierung eines Objekts aufgefüllt werden.

So habe ich ein einfaches Beispiel erstellt, um das Verhalten zu zeigen. Das Folgende ist eine einfache Klasse mit einigen Eigenschaften, die einige Codestandards haben.

[Serializable]
public class TestConfiguration
   {
      public String Name 
      { 
         get
         {
            return mName;
         }
         set
         {
            mName = value;
         }
      }private String mName = "Pete Sebeck";

  public List<String> Associates 
  { 
     get
     {
        return mAssociates;
     }
     set
     {
        mAssociates = value;
     }
  } private List<String> mAssociates = new List<string>() { "Jon", "Natalie" };

  public override String ToString()
  {
     StringBuilder buffer = new StringBuilder();
     buffer.AppendLine(String.Format("Name: {0}", Name));
     buffer.AppendLine("Associates:");
     foreach(String associate in mAssociates)
     {
        buffer.AppendLine(String.Format("\t{0}", associate));
     }
     return buffer.ToString();
  }
   }

Und hier ist ein Hauptmenü, das neue Objekte erstellt, den Status des Objekts in die Konsole druckt, es in eine Datei serialisiert (xml), ein Objekt aus dieser Datei wiederherstellt und den Status des Objekts erneut in die Konsole druckt. Was ich erwartet hatte, war ein Objekt, das mit dem übereinstimmte, was serialisiert wurde. Was ich bekam, war das Standardobjekt, bei dem der Inhalt der serialisierten Liste zum Standard hinzugefügt wurde.

  static void Main(string[] args)
  {
     // Create a default object
     TestConfiguration configuration = new TestConfiguration();
     Console.WriteLine(configuration.ToString());

     // Serialize the object
     XmlSerializer writer = new XmlSerializer(typeof(TestConfiguration));
     StreamWriter filewriter = new StreamWriter("TestConfiguration.xml");
     writer.Serialize(filewriter, configuration);
     filewriter.Close();

     // Now deserialize the xml into another object
     XmlSerializer reader = new XmlSerializer(typeof(TestConfiguration));
     StreamReader filereader = new StreamReader("TestConfiguration.xml");
     TestConfiguration deserializedconfiguration = (TestConfiguration)reader.Deserialize(filereader);
     filereader.Close();

     Console.WriteLine(deserializedconfiguration.ToString());

     Console.ReadLine();
      }

Ergebnisse

Name: Pete Sebeck
Associates:
        Jon
        Natalie

Name: Pete Sebeck
Associates:
        Jon
        Natalie
        Jon
        Natalie

Ich denke, ich dachte immer, die List-Eigenschaft würde eher gesetzt als angehängt. Hat jemand einen Hinweis auf den Deserialisierungsprozess für Sammlungen? Anscheinend kenne ich jetzt die richtigen Suchbegriffe, da meine Versuche leer sind. Ich sehe andere Posts, die beschreiben, was ich sehe und wie sie die Serialisierung selbst implementieren. Ich bin eher auf der Suche nach einem Zeiger, der beschreibt, was passiert, wenn eine Sammlung deserialisiert wird, damit ich mir selbst erklären kann, was ich sehe.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage