使用派生类型的XML序列化

时间:2013-11-18 12:25:02

标签: c# xml-serialization derived-class

我再次遇到让串行器工作的问题。我有一个基类A和一个派生类B:

class Program
{
    static void Main(string[] args)
    {
        A foo = new B();

        // determine that the class B overrides A
        XmlAttributeOverrides overrides = new XmlAttributeOverrides();
        overrides.Add(typeof(A), new XmlAttributes
        {
            XmlElements = { new XmlElementAttribute("B", typeof(B)) }
        });

        XmlSerializer ser = new XmlSerializer(typeof(A), overrides);
        ser.Serialize(new XmlTextWriter("test.xml", Encoding.Default), foo);

    }
}

public class A { public int a;}
public class B : A { public int b;}

但是当我运行这个小程序时,我得到了异常

  

可能未为ConsoleApplication1.A

类型指定XmlRoot和XmlType属性

但是我从未确定过A类的root或type-attribute,所以我对此消息感到困惑。我必须在幕后指明什么吗?我想做的就是序列化一个B的实例,只需在A ...的定义中添加一些属性即可。

2 个答案:

答案 0 :(得分:4)

正好在您收到的错误消息中。

  

可能未为ConsoleApplication1.A

类型指定XmlRoot和XmlType属性

您必须为输出xml文档指定根元素。

替换

overrides.Add(typeof(A), new XmlAttributes

overrides.Add(typeof(A), "node", new XmlAttributes

你可能还需要替换

new XmlSerializer(typeof(A), overrides);     

new XmlSerializer(typeof(B), overrides);

有关覆盖的更多信息和示例,请访问MSDN

答案 1 :(得分:2)

我终于有了两个解决方案:

第1名:

...
XmlSerializer ser = new XmlSerializer(typeof(A));
ser.Serialize(new XmlTextWriter("test.xml", Encoding.Default), foo);
...         

[System.Xml.Serialization.XmlRoot("Root", Namespace = "DefaultNS")]
[System.Xml.Serialization.XmlInclude(typeof(B))]
public class A { public int a;}

[System.Xml.Serialization.XmlRoot(Namespace = "CustomNS")]
public class B : A { public int b;}

2号(除了Ondrejs解决方案):

...
XmlSerializer ser = new XmlSerializer(typeof(A), overrides, new[] { typeof(B) }, new XmlRootAttribute("Root"), "defautlNS");
...

public class A { public int a;}
public class B : A { public int b;}

与第一个解决方案相比,第二个解决方案的缺点是,您可能无法看到XML文档中的属性来自(来自defaultNS或customNS),因为您无法指定任何自定义。