繁体   English   中英

具有派生类型的XML序列化

[英]XML-serialization with derived types

在使我的序列化器正常工作时,我又遇到了一个问题。 我有一个基类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的根或类型属性,因此我对此消息感到非常困惑。 我必须指定幕后内容吗? 我想要做的就是序列化B的实例,该实例只需向A的定义中添加一些属性即可。

就在您收到的错误消息中。

可能未为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号:

...
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;}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM