Desserialização XML da propriedade de coleção com padrões de código
Para a configuração do aplicativo, frequentemente crio uma classe de configuração com valores de configuração para o aplicativo que depois desserializo em um objeto a ser utilizado. O objeto de configuração geralmente é vinculado a um controle da interface do usuário para que a configuração possa ser alterada e persistida pelo usuário. A classe de configuração geralmente possui valores padrão atribuídos às propriedades para que sempre haja uma configuração padrão. Isso funcionou bem. Recentemente, tive uma situação em que tinha uma lista de seqüências de caracteres que forneciam algumas informações de caminho padrão. E o que vi me fez perceber que não sabia completamente como as propriedades do objeto estão sendo preenchidas durante a desserialização de XML para um objeto.
Então, eu criei um exemplo simples para mostrar o comportamento. A seguir, é apresentada uma classe simples que possui algumas propriedades com alguns padrões de código.
[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();
}
}
E aqui está uma principal que cria um novo objeto, imprime o estado do objeto no console, serializa (xml) em um arquivo, reconstitui um objeto desse arquivo e imprime novamente o estado do objeto no console. O que eu esperava era um objeto que correspondesse ao que foi serializado. O que obtive foi o objeto padrão com o conteúdo da lista serializada adicionado ao padrão.
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();
}
Resultados:
Name: Pete Sebeck
Associates:
Jon
Natalie
Name: Pete Sebeck
Associates:
Jon
Natalie
Jon
Natalie
Acho que sempre pensei que a propriedade List seria configurada em vez de anexada. Alguém tem um ponteiro para o processo de desserialização de coleções? Aparentemente, agora eu sei os termos de pesquisa corretos, pois minhas tentativas estão vazias. Vejo outros posts descrevendo o que estou vendo e a abordagem deles de implementar a serialização. Estou mais procurando por um ponteiro que descreva o que acontece quando uma coleção é desserializada para que eu possa explicar para mim mesma o que estou vendo.