XmlSerializer 在序列化包含派生类通用列表的对象时提出了挑战。 这些派生元素的抽象基类性质通常会在反序列化期间产生 InvalidOperationException
。 让我们探讨一下这个常见问题的解决方案。
存在三种有效的策略来克服此限制:
[XmlInclude]
属性<code class="language-csharp">//1: [XmlInclude(typeof(ChildA))] //1: [XmlInclude(typeof(ChildB))] public abstract class ChildClass { /* ... */ }</code>
此方法需要使用每个派生类的 ChildClass
属性注释基类 ([XmlInclude]
)。
[XmlElement]
或 [XmlArrayItem]
<code class="language-csharp"> //2: [XmlElement("A", Type = typeof(ChildA))] //2: [XmlElement("B", Type = typeof(ChildB))] public List<ChildClass> Data { get; set; }</code>
此处,[XmlElement]
或 [XmlArrayItem]
属性直接应用于包含派生类列表的属性。 这为序列化器提供了显式的类型信息。
[XmlArrayItem]
财产<code class="language-csharp"> //3: [XmlArrayItem("A", Type = typeof(ChildA))] //3: [XmlArrayItem("B", Type = typeof(ChildB))] public List<ChildClass> Data { get; set; }</code>
此方法镜像方法 2,但使用 [XmlArrayItem]
而不是 [XmlElement]
,提供略有不同的 XML 结构。
每种方法都可以使用派生类列表成功序列化和反序列化对象。最佳选择取决于您的应用程序对 XML 结构和灵活性的特定要求。
以上是如何使用 XmlSerializer 成功序列化和反序列化派生类的通用列表?的详细内容。更多信息请关注PHP中文网其他相关文章!