我遇到过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!
答案 0 :(得分:1)
问题确实微不足道:
public class Project
{
[XmlElement("ProjectItem", typeof(ProjectItem))]
public ProjectItemCollection { get; set; }
}
在typeof(ProjectItem)
中指定XmlElement
对序列化无效。但是,它对于反序列化来说至关重要。
答案 1 :(得分:0)
如果您继续使用XmlSerializer,您可能会发现XAML序列化(移出WPF并且现在可以在它自己的System.Xaml.dll中完全可用)很有帮助。它非常强大且可扩展。