Estoy notando un comportamiento extraño con el XmlSerializer y listas genéricas (específicamente List<int>
). Me preguntaba si alguien ha visto esto antes o si sabe lo que está pasando. Parece que la serialización funciona bien, pero la deserialización quiere agregar elementos adicionales a la lista. El código a continuación demuestra el problema.Deserializando la lista <int> con XmlSerializer causando elementos extra
clase Serializable: Código
public class ListTest
{
public int[] Array { get; set; }
public List<int> List { get; set; }
public ListTest()
{
Array = new[] {1, 2, 3, 4};
List = new List<int>(Array);
}
}
prueba: salida
ListTest listTest = new ListTest();
Debug.WriteLine("Initial Array: {0}", (object)String.Join(", ", listTest.Array));
Debug.WriteLine("Initial List: {0}", (object)String.Join(", ", listTest.List));
XmlSerializer serializer = new XmlSerializer(typeof(ListTest));
StringBuilder xml = new StringBuilder();
using(TextWriter writer = new StringWriter(xml))
{
serializer.Serialize(writer, listTest);
}
Debug.WriteLine("XML: {0}", (object)xml.ToString());
using(TextReader reader = new StringReader(xml.ToString()))
{
listTest = (ListTest) serializer.Deserialize(reader);
}
Debug.WriteLine("Deserialized Array: {0}", (object)String.Join(", ", listTest.Array));
Debug.WriteLine("Deserialized List: {0}", (object)String.Join(", ", listTest.List));
Depuración:
Initial Array: 1, 2, 3, 4
Initial List: 1, 2, 3, 4
XML:
<?xml version="1.0" encoding="utf-16"?>
<ListTest xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Array>
<int>1</int>
<int>2</int>
<int>3</int>
<int>4</int>
</Array>
<List>
<int>1</int>
<int>2</int>
<int>3</int>
<int>4</int>
</List>
</ListTest>
Deserialized Array: 1, 2, 3, 4
Deserialized List: 1, 2, 3, 4, 1, 2, 3, 4
Observe que tanto el conjunto como la lista parecen haberse serializado en XML correctamente, pero en la deserialización, la matriz sale correcta pero la lista vuelve con un conjunto duplicado de elementos. ¿Algunas ideas?
Gracias por las respuestas - como he mencionado en un comentario más abajo, no me di cuenta del deserializer fue capaz de mutar el estado de los miembros durante la deserialización (en la mayoría de los casos creo que sólo establece nuevos valores, ¿verdad?) ¿Es la lista la única clase con la que puede hacer esto? ¿Hay alguna referencia que indique qué clases puede mutar el deserializador? –
daveaglick