ホームページ >バックエンド開発 >C++ >XmlSerializer を使用してジェネリック リスト内の派生クラスをシリアル化する方法

XmlSerializer を使用してジェネリック リスト内の派生クラスをシリアル化する方法

Patricia Arquette
Patricia Arquetteオリジナル
2025-01-11 10:42:45531ブラウズ

How to Serialize Derived Classes within Generic Lists using XmlSerializer?

XmlSerializer を使用して派生クラスをシリアル化します

XmlSerializer を使用して、抽象クラス派生クラスの汎用リストを含むオブジェクトをシリアル化する場合、逆シリアル化プロセス中に InvalidOperationException 例外が発生する可能性があります。この問題を解決するには、派生オブジェクトのシリアル化を処理するための特別なテクニックが必要です。

解決策

効果的な方法は 3 つあります:

  1. [XmlInclude] 属性: 各派生クラス型を含む、抽象クラス宣言の前に [XmlInclude] 属性を適用します。これにより、シリアライザーがこれらの特定の派生型を処理する方法を認識できるようになります。
  2. XmlElement/XmlArrayItem 属性: リストを含む属性で [XmlElement] または [XmlArrayItem] 属性を使用します。これらのプロパティで派生クラスの型を指定して、オブジェクトを認識して逆シリアル化するようにシリアライザーに指示します。
  3. 2 つのメソッドの組み合わせ: 抽象クラスで [XmlInclude] を使用し、プロパティで [XmlElement] または [XmlArrayItem] を使用して、これら 2 つのメソッドを組み合わせます。これにより、明示的および暗黙的な Type 処理が提供されます。

次のコード スニペットは、各メソッドを使用した詳細な実装例を示しています。

<code class="language-csharp">// 1: [XmlInclude(typeof(ChildA))]
// 1: [XmlInclude(typeof(ChildB))]
public abstract class ChildClass {
    public string ChildProp { get; set; }
}

// 2: [XmlElement("A", Type = typeof(ChildA))]
// 2: [XmlElement("B", Type = typeof(ChildB))]
// 3: [XmlArrayItem("A", Type = typeof(ChildA))]
// 3: [XmlArrayItem("B", Type = typeof(ChildB))]
public List<ChildClass> Data { get; set; }

// ... 序列化和反序列化代码在此处 ...</code>

優先メソッドを選択し、派生クラスのシリアル化に対応するコード スニペットのコメントを解除します。

以上がXmlSerializer を使用してジェネリック リスト内の派生クラスをシリアル化する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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