我再次遇到让串行器工作的问题。我有一个基类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 ...的定义中添加一些属性即可。
答案 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),因为您无法指定任何自定义。