首页 >后端开发 >C++ >如何使用 XmlSerializer 成功序列化和反序列化派生类的通用列表?

如何使用 XmlSerializer 成功序列化和反序列化派生类的通用列表?

Barbara Streisand
Barbara Streisand原创
2025-01-11 10:35:46434浏览

How Can I Successfully Serialize and Deserialize Generic Lists of Derived Classes Using XmlSerializer?

使用 XmlSerializer 序列化和反序列化派生类的通用列表

XmlSerializer 在序列化包含派生类通用列表的对象时提出了挑战。 这些派生元素的抽象基类性质通常会在反序列化期间产生 InvalidOperationException。 让我们探讨一下这个常见问题的解决方案。

解决序列化/反序列化问题

存在三种有效的策略来克服此限制:

1.使用 [XmlInclude] 属性

<code class="language-csharp">//1: [XmlInclude(typeof(ChildA))]
//1: [XmlInclude(typeof(ChildB))]
public abstract class ChildClass { /* ... */ }</code>

此方法需要使用每个派生类的 ChildClass 属性注释基类 ([XmlInclude])。

2.在该物业上雇用 [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] 属性直接应用于包含派生类列表的属性。 这为序列化器提供了显式的类型信息。

3.利用[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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn