在.NET中不使用XmlInclude序列化成员类型
本文关键字:序列化 成员 成员类 类型 XmlInclude NET | 更新日期: 2023-09-27 18:19:45
我正在.NET 中执行XML序列化
我有以下等级的
public class MainClass
{
public ClassA A;
}
public class ClassA { }
public class ClassB : ClassA { }
public class ClassC : ClassA { }
当我在MainClass的对象上调用XmlSerializer
的Serialize
方法时,我得到了建议使用XmlInclude
属性的异常。我不想使用属性选项。
Serialize
方法有一个重载,它使用Type的数组来指定正在执行序列化的类型(上例中为MainClass)的子类型。使用这个重载,我们可以避免使用XmlInclude
属性标记类。
对于正在序列化的类型(上例中的MainClass)的成员,可以做类似的事情吗?
var ser = new XmlSerializer(typeof(MainClass),
new[] { typeof(ClassA), typeof(ClassB), typeof(ClassC) });
ser.Serialize(writer, new MainClass { A = new ClassB() });
结果:
<MainClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<A xsi:type="ClassB" />
</MainClass>
或者,您可以通过编程方式添加属性:
var overrides = new XmlAttributeOverrides();
// Add [XmlElement]'s to MainClass.A
overrides.Add(typeof(MainClass), "A", new XmlAttributes
{
XmlElements = {
new XmlElementAttribute() { Type = typeof(ClassA) },
new XmlElementAttribute() { Type = typeof(ClassB) },
new XmlElementAttribute() { Type = typeof(ClassC) },
}
});
var ser = new XmlSerializer(typeof(MainClass), overrides, null, null, null);
ser.Serialize(writer, new MainClass { A = new ClassB() });
结果:
<MainClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<ClassB />
</MainClass>