XmlSerializer を使用して派生クラスをシリアル化します
XmlSerializer を使用して、抽象クラス派生クラスの汎用リストを含むオブジェクトをシリアル化する場合、逆シリアル化プロセス中に InvalidOperationException 例外が発生する可能性があります。この問題を解決するには、派生オブジェクトのシリアル化を処理するための特別なテクニックが必要です。
解決策
効果的な方法は 3 つあります:
[XmlInclude]
属性: 各派生クラス型を含む、抽象クラス宣言の前に [XmlInclude]
属性を適用します。これにより、シリアライザーがこれらの特定の派生型を処理する方法を認識できるようになります。 XmlElement
/XmlArrayItem
属性: リストを含む属性で [XmlElement]
または [XmlArrayItem]
属性を使用します。これらのプロパティで派生クラスの型を指定して、オブジェクトを認識して逆シリアル化するようにシリアライザーに指示します。 [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 サイトの他の関連記事を参照してください。