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中文網其他相關文章!