XmlSerializer は、派生クラスの汎用リストを含むオブジェクトをシリアル化するときに問題を引き起こします。 これらの派生要素の抽象基本クラスの性質により、逆シリアル化中に InvalidOperationException
が発生することがよくあります。 この一般的な問題の解決策を探ってみましょう。
この制限を克服するには、次の 3 つの効果的な戦略が存在します。
[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 中国語 Web サイトの他の関連記事を参照してください。