首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IXmlSerializable抽象类创建异常

IXmlSerializable抽象类创建异常
EN

Stack Overflow用户
提问于 2014-04-04 15:52:19
回答 1查看 559关注 0票数 0

我试图使用WorldObject接口将从单个抽象超类IXmlSerializable派生的一系列子类序列化为IXmlSerializable。我必须使用这个接口,因为我希望类在反序列化时订阅一些事件。

使用this答案,我得出了以下代码:

代码语言:javascript
复制
[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设置为与演示的here相同的值,但错误仍然存在。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-08 19:02:56

我从来没有找到摆脱异常的方法,但我找到了解决办法。该解决方案只需编写自己的元素包装器,并以类型作为其名称,调用WriteXml函数并写入end元素。

代码语言:javascript
复制
foreach (WorldObject wO in list)
        {
             writer.WriteStartElement(wO.GetType().ToString());

             wO.WriteXml(writer);

             writer.WriteEndElement();
        }

这也允许您反序列化抽象类的具体实现。wO.GetType().ToString()使用具体的类和名称空间创建字符串。然后,您可以创建一个XmlSerializer,其中类型从元素包装器名称中收集,如下所示:

代码语言:javascript
复制
Type t = Type.GetType(reader.LocalName);
XmlSerializer worldObjectSerializer = new XmlSerializer(t, new XmlRootAttribute(reader.LocalName));
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22867457

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档