Deserializing List<int> with XmlSerializer Causing Extra Items

天大地大妈咪最大 提交于 2019-11-26 23:28:07

问题


I'm noticing an odd behavior with the XmlSerializer and generic lists (specifically List<int>). I was wondering if anyone has seen this before or knows what's going on. It appears as though the serialization works fine but the deserialization wants to add extra items to the list. The code below demonstrates the problem.

Serializable class:

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

Test code:

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

Debug output:

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

Notice that both the array and list appear to have serialized to XML correctly but on deserialization the array comes out correct but the list comes back with a duplicate set of items. Any ideas?


回答1:


It happens because you are initializing the List in the constructor. When you go to deserialize, a new ListTest is created and then it populate the object from state.

Think of the workflow like this

  1. Create a new ListTest
  2. Execute the Constructor (add 1,2,3,4)
  3. Deserialize the xml state, and add 1,2,3,4 to the List

A simple solution would be to init the object outside the scope of the constructor.

public class ListTest
{
    public int[] Array { get; set; }
    public List<int> List { get; set; }

    public ListTest()
    {

    }

    public void Init() 
    {
        Array = new[] { 1, 2, 3, 4 };
        List = new List<int>(Array);
    }
}

ListTest listTest = new ListTest();
listTest.Init(); //manually call this to do the initial seed



回答2:


The issue is that you're defining the original 1,2,3,4 in the List in the default constructor. Your deserializer is adding to the list, not defining it.



来源:https://stackoverflow.com/questions/9589589/deserializing-listint-with-xmlserializer-causing-extra-items

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!