繁体   English   中英

IXmlSerializable抽象类创建异常

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

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