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