如何将填充了其子类的基类数组序列化为XML?

时间:2010-12-27 13:28:00

标签: c# xml serialization xml-serialization

我正在尝试序列化包含一些Test个对象的TestChild个对象数组。

public class Test
{
    public string SomeProperty { get; set; }
}

public class TestChild : Test
{
    public string SomeOtherProperty { get; set; }
}

class Program
{
    static void Main()
    {
        Test[] testArray = new[]
        {
            new TestChild { SomeProperty = "test1", SomeOtherProperty = "test2" },
            new TestChild { SomeProperty = "test3", SomeOtherProperty = "test4" },
            new TestChild { SomeProperty = "test5", SomeOtherProperty = "test6" },
        };

        XmlSerializer xs = new XmlSerializer(typeof(Test));

        using (XmlWriter writer = XmlWriter.Create("test.xml"))
            xs.Serialize(writer, testArray);
    }
}

我得到了InvalidOperationException,表示TestChild无法转换为Test。

这是有道理的但是还有办法吗?

2 个答案:

答案 0 :(得分:1)

最简单的方法是对类进行注释,以便序列化程序预期子类:

[XmlInclude(typeof(TestChild))]
public class Test
{
    public string SomeProperty { get; set; }
}

否则(如果使用XmlSerializer的更复杂的构造函数),您需要非常小心缓存并重新使用序列化程序实例 - 否则会导致内存出血(它会创建一个每次无法进行垃圾回收时的汇编; 最简单的构造函数只需要Type为您处理此缓存。)

答案 1 :(得分:0)

您可以使用proper constructor指定已知类型,也可以序列化测试数组Test[]而不是Test,因此构造函数的第一个参数应为{{1} }:

typeof(Test[])