2013-06-25 52 views
0

使用XmlInclude我在.NET进行XML序列序列化成员类型在.NET

我有下面的类

public class MainClass 
{ 
    public ClassA A; 
} 

public class ClassA { } 

public class ClassB : ClassA { } 

public class ClassC : ClassA { } 

当我MainClass的对象上调用的XmlSerializerSerialize方法,我得到的例外是建议使用XmlInclude属性。我不想使用属性选项。

Serialize方法有一个重载,它接受Type的数组来指定序列化的类型(MainClass)的子类型。使用这种超载,我们可以避免需要用XmlInclude属性标记类。

类似的事情可以与类型的成员(上例中的MainClass)被序列化?

回答

2
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> 
+0

我想避免属性,正如我在我的问题中所说的。我知道这个解决方案。有没有一些方法可以在不使用属性的情况下完成? – Brij

+0

非常感谢:) – Brij

相关问题