[英]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.