C# XmlSerializer可以';t在以下情况下反序列化自己的输出;“外部类型”;提供

C# XmlSerializer可以';t在以下情况下反序列化自己的输出;“外部类型”;提供,c#,.net-3.5,xml-serialization,C#,.net 3.5,Xml Serialization,我遇到了一种情况,XmlSerializer无法反序列化回它自己的输出。数据结构基本上由一个根类Project组成,其中包含一个ProjectItems属性(属于自定义集合类型),该属性包含单个项。某些项可能递归地包含嵌套项 public class Project { [XmlElement("ProjectItem")] public ProjectItemCollection { get; set; } } XmlSerializer生成的XML如下所示: <Pro

我遇到了一种情况,
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>

注意:所有不重要的东西都将从代码示例中删除

最初,我用
xmlclude
属性装饰了
ProjectItem
类,以覆盖数据结构中可能出现的所有类型的项。效果很好

但是,由于它需要从独立的程序集进行扩展,因此我必须使用一个动态构造的数组来替换这些属性,该数组包含传递给
XmlSerializer
构造函数的
extraTypes
参数的所有可能类型

同样,序列化工作正常。问题是,当我尝试反序列化它时,
XmlSerializer
抛出一个
InvalidCastException
说:

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

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



旁注:我再也受不了跳
XmlSerializer
子弹了-

问题确实很小:

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

xmlement
中指定
typeof(ProjectItem)
对于序列化是无用的。然而,它对于反序列化非常关键

问题确实很小:

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

xmlement
中指定
typeof(ProjectItem)
对于序列化是无用的。但是,反序列化非常重要如果您继续使用XmlSerializer,您可能会发现XAML序列化(已从WPF中移出,现在在它自己的系统.XAML.dll中完全可用)很有帮助。它非常强大且可扩展。

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

谢谢您的提示。我一定去看看。实际上,我再次非常接近于编写一个
XmlSerializer
替代品。太糟糕了,谢谢你的提示。我一定去看看。实际上,我再次非常接近于编写一个
XmlSerializer
替代品。简直糟透了。