0

我正在尝试将一个对象序列化为 XML,并且在序列化为 XML 时一直在使用一个小测试器来试验不同的对象行为。我知道二进制序列化器很深,而 XML 很浅。但是,它似乎在使用 XML 时尝试序列化在另一个对象中组成的 List。

我的问题是,当我序列化一个列表时,我得到了复制的数据。代码和输出如下:

class Program
{
    static void Main(string[] args)
    {
        TestSerializer original = new TestSerializer();
        System.Xml.Serialization.XmlSerializer x = new System.Xml.Serialization.XmlSerializer(original.GetType());
        x.Serialize(Console.Out, original);
        Console.WriteLine("\n\n\n");

        using (MemoryStream stream = new MemoryStream())
        {
            x.Serialize(stream, original);
            stream.Seek(0, SeekOrigin.Begin);

            TestSerializer copy = x.Deserialize(stream) as TestSerializer;
            x.Serialize(Console.Out, copy);
        }
        Console.ReadLine();
    }
}

public class TestSerializer
{
    public List<string> words = new List<string>();
    public TestSerializer()
    {
        words.Add("word");
        words.Add("anotherword");
    }
}

以及相应的输出:

<?xml version="1.0" encoding="IBM437"?>
<TestSerializer xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd=
"http://www.w3.org/2001/XMLSchema">
  <words>
    <string>word</string>
    <string>anotherword</string>
  </words>
</TestSerializer>



<?xml version="1.0" encoding="IBM437"?>
<TestSerializer xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd=
"http://www.w3.org/2001/XMLSchema">
  <words>
    <string>word</string>
    <string>anotherword</string>
    <string>word</string>
    <string>anotherword</string>
  </words>
</TestSerializer>

如您所见,“原始”序列化时列表内容加倍,然后反序列化为“复制”。就这一点而言,我有什么遗漏吗?似乎不应该有重复的数据。

4

1 回答 1

3

在 TestSerializer 类的构造函数上放置一个断点。您会注意到它在以下行中被调用:

TestSerializer copy = x.Deserialize(stream) as TestSerializer;

因此,当您反序列化以下对象时

  1. 创建 TestSerializer 的第一个实例(填充列表中的两个值)并执行默认构造函数
  2. 反序列化将流中的项目添加到创建的对象(现在你有 4 个项目)
于 2012-08-26T07:17:03.600 回答