我正在尝试使用WorldObject
接口将从单个抽象超类IXmlSerializable
派生的一系列子类序列化为XML。我必须使用这个接口,因为我希望该类在反序列化时订阅一些事件。
使用this回答,我想出了以下代码:
[XmlInclude(typeof(SubType1))
,XmlInclude(typeof(SubType2))] // etc, includes all subtypes
public abstract class WorldObject : IComparable, IXmlSerializable
public void WriteXml(System.Xml.XmlWriter writer)
{
Type[] extraTypes = new Type[8];
// (...) adding types to array here
var worldObjectSerializer = new XmlSerializer(typeof(List<WorldObject>), extraTypes);
}
初始化XmlSerializer
的最后一行会引发运行时错误:System.MissingMethodException:无法创建抽象类&#39; Namespace.WorldObject&#39;。当我尝试使用typeof(WorldObject)
而不是typeof(List<WorldObject>)
时,会抛出相同的错误。
我还尝试将XMLRoot设置为每个类中与演示here相同的值,但错误仍然存在。
答案 0 :(得分:1)
我从未找到摆脱异常的方法,但我找到了解决方法。该解决方案只是编写自己的元素包装器,其类型为其名称,调用WriteXml函数并写入结束元素。
foreach (WorldObject wO in list)
{
writer.WriteStartElement(wO.GetType().ToString());
wO.WriteXml(writer);
writer.WriteEndElement();
}
这允许您反序列化抽象类的具体实现。 wO.GetType().ToString()
创建一个包含具体类和名称空间的字符串。然后你可以创建一个XmlSerializer
,其中的类型是从元素包装器名称中收集的,如下所示:
Type t = Type.GetType(reader.LocalName);
XmlSerializer worldObjectSerializer = new XmlSerializer(t, new XmlRootAttribute(reader.LocalName));