XML десериализация свойства коллекции с использованием кода по умолчанию

Для конфигурации приложения я часто создаю класс конфигурации со значениями конфигурации для приложения, которые затем десериализуем в объект для использования. Объект конфигурации обычно привязывается к элементу управления пользовательского интерфейса, так что пользователь может изменить и сохранить конфигурацию. Класс конфигурации обычно имеет значения по умолчанию, назначенные свойствам, так что всегда есть конфигурация по умолчанию. Это сработало хорошо. Недавно у меня была ситуация, когда у меня был список строк, которые предоставили некоторую информацию о пути по умолчанию. И то, что я увидел, заставило меня понять, что я не полностью знал, как свойства объекта заполняются во время десериализации XML в объект.

Поэтому я создал простой пример, чтобы показать поведение. Ниже приведен простой класс, имеющий несколько свойств с некоторыми значениями кода по умолчанию.

[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();
  }
   }

И вот основной, который создает новые объекты, печатает состояние объекта на консоли, сериализует (xml) его в файл, восстанавливает объект из этого файла и снова выводит состояние объекта на консоль. То, что я ожидал, было объектом, который соответствовал тому, что было сериализовано. Я получил объект по умолчанию с содержимым сериализованного списка, добавленного к стандартному.

  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();
      }

Результаты:

Name: Pete Sebeck
Associates:
        Jon
        Natalie

Name: Pete Sebeck
Associates:
        Jon
        Natalie
        Jon
        Natalie

Наверное, я всегда думал, что свойство List будет установлено, а не добавлено. У кого-нибудь есть указатель на процесс десериализации для коллекций? Похоже, теперь я знаю правильные условия поиска, так как мои попытки оказываются пустыми. Я вижу другие посты, описывающие то, что я вижу, и их подход к реализации сериализации самостоятельно. Я больше ищу указатель, который описывает, что происходит, когда коллекция десериализуется, чтобы я мог объяснить себе, что я вижу.

Ответы на вопрос(1)

Ваш ответ на вопрос