IXml可序列化抽象类创建异常

本文关键字:创建 异常 抽象类 序列化 IXml | 更新日期: 2023-09-27 17:56:45

我正在尝试使用 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 设置为相同的值,如此处所示,但错误仍然存在。

IXml可序列化抽象类创建异常

我从来没有找到摆脱异常的方法,但我找到了解决方法。该解决方案只需以类型作为名称编写自己的元素包装器,调用 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));