![](/img/trans.png)
[英]Custom class with IXmlSerializable fails with OutOfMemoryException
[英]IXmlSerializable abstract class creation exception
我正在尝试使用IXmlSerializable
接口将一系列从单个抽象超类WorldObject
到XML的子类序列化。 我必须使用此接口,因为我希望类在反序列化时订阅一些事件。
使用此答案,我想到了以下代码:
[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:无法创建抽象类'Namespace.WorldObject'。 当我尝试使用typeof(WorldObject)
而不是typeof(List<WorldObject>)
时,会引发相同的错误。
我也曾尝试设置XMLRoot为相同的值在每类中表现出在这里 ,但错误依然存在。
我从未找到摆脱异常的方法,但找到了解决方法。 该解决方案只是简单地使用类型作为名称编写自己的元素包装器,调用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));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.