ホームページ >バックエンド開発 >C++ >XmlSerializer を使用して派生クラスの汎用リストを正常にシリアル化および逆シリアル化するにはどうすればよいですか?

XmlSerializer を使用して派生クラスの汎用リストを正常にシリアル化および逆シリアル化するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2025-01-11 10:35:46476ブラウズ

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

XmlSerializer を使用した派生クラスの汎用リストのシリアル化と逆シリアル化

XmlSerializer は、派生クラスの汎用リストを含むオブジェクトをシリアル化するときに問題を引き起こします。 これらの派生要素の抽象基本クラスの性質により、逆シリアル化中に InvalidOperationException が発生することがよくあります。 この一般的な問題の解決策を探ってみましょう。

シリアル化/逆シリアル化の問題への対処

この制限を克服するには、次の 3 つの効果的な戦略が存在します。

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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。