我正在尝试序列化包含一些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。
这是有道理的但是还有办法吗?
答案 0 :(得分:1)
最简单的方法是对类进行注释,以便序列化程序预期子类:
[XmlInclude(typeof(TestChild))]
public class Test
{
public string SomeProperty { get; set; }
}
否则(如果使用XmlSerializer
的更复杂的构造函数),您需要非常小心缓存并重新使用序列化程序实例 - 否则会导致内存出血(它会创建一个每次无法进行垃圾回收时的汇编; 最简单的构造函数只需要Type
为您处理此缓存。)
答案 1 :(得分:0)
您可以使用proper constructor指定已知类型,也可以序列化测试数组Test[]
而不是Test
,因此构造函数的第一个参数应为{{1} }:
typeof(Test[])