当提供“extraTypes”时,XmlSerializer无法反序列化自己的输出

时间:2011-02-27 20:07:17

标签: c# .net-3.5 xml-serialization

我遇到过XmlSerializer无法反序列化自己的输出的情况。数据结构基本上由一个根类Project组成,其中包含一个ProjectItems属性(自定义集合类型),包含单个项目。某些项目可能会递归地包含嵌套项目。

public class Project
{
    [XmlElement("ProjectItem")]
    public ProjectItemCollection { get; set; }
}

XmlSerializer生成的XML如下所示:

<Project>
    <ProjectItem xsi:type="ContentOrganizationPlanProjectItem">
        <ProjectItem xsi:type="FolderProjectItem">
        </ProjectItem>
        <ProjectItem xsi:type="FolderProjectItem">
        </ProjectItem>
    </ProjectItem>
</Project>

注意:从代码示例中删除所有不重要的内容。

最初,我使用ProjectItem属性修饰了XmlInclude类,以涵盖数据结构中可能出现的所有各种类型的项目。这很好。

但是,因为它需要可以从独立程序集中扩展,所以我必须使用this SO answer将所有可能类型的动态构造数组替换为XmlSerializer构造函数的extraTypes参数。

再次序列化工作正常。问题是,当我尝试将其反序列化时,XmlSerializer会抛出InvalidCastException说:

  

无法将'System.Xml.XmlNode []'类型的对象强制转换为'Whatever.ProjectItem'。

在这种情况下如何让XmlSerializer反序列化自己的输出?


旁注:我再也无法忍受XmlSerializer子弹了 - Trinity, help!

2 个答案:

答案 0 :(得分:1)

问题确实微不足道:

public class Project
{
    [XmlElement("ProjectItem", typeof(ProjectItem))]
    public ProjectItemCollection { get; set; }
}

typeof(ProjectItem)中指定XmlElement对序列化无效。但是,它对于反序列化来说至关重要

答案 1 :(得分:0)

如果您继续使用XmlSerializer,您可能会发现XAML序列化(移出WPF并且现在可以在它自己的System.Xaml.dll中完全可用)很有帮助。它非常强大且可扩展。