XML シリアル化により、開発者はオブジェクトを XML に変換したり、XML をオブジェクトに逆シリアル化したりできます。インターフェイス型のプロパティを含むオブジェクトをシリアル化しようとすると、宣言型シリアル化の固有の制限によりエラーが発生する可能性があります。
提供された例では、Example クラスには IModelObject 型のプロパティがあります。インターフェース。このクラスのインスタンスをシリアル化しようとすると、プロパティがインターフェイスであるためシリアル化できないことを示すエラーが発生します。
インターフェイスは直接シリアル化できないため、別のアプローチが必要です。
1. XmlAttributeOverrides と抽象型
XML シリアル化はインターフェイスのシリアル化をネイティブにサポートしませんが、XmlAttributeOverrides と抽象クラスを使用して同様の効果を実現できます。ただし、これにはインターフェイスを抽象型または具象型に置き換え、XMLInclude アノテーションによる継承を使用する必要があり、面倒な回避策のように感じることがあります。
2. XmlAnything Wrapper Class
より堅牢な解決策は、IXmlSerializable を実装するラッパー クラスを作成することです。このようにして、シリアル化と逆シリアル化のプロセスを完全に制御できるようになり、ラッパー内の特定の型に変換することでインターフェイスに対応できます。
3. Hidden Backing Property
もう 1 つのオプションは、シリアル化できるバッキング プロパティを使用してインターフェイス プロパティを非表示にし、インターフェイス タイプの値を処理するための別のプロパティを維持することです。このアプローチにより、継承という醜い回避策が回避されますが、プロパティのメンテナンスがさらに複雑になります。
4.非表示にして後で処理します
あるいは、必要な型変換を実行するインターフェイスのゲッター専用プロパティを実装することもできます。ただし、これはインターフェイス プロパティの逆シリアル化操作を実行する必要がない場合にのみ機能します。
最終的に、最適なソリューションはアプリケーションの特定の要件によって異なります。シリアル化に対する柔軟性と制御が必要な場合は、IXmlSerializable または XmlAnything ラッパー クラスの使用を検討してください。定型文を最小限に抑えたシンプルなアプローチを希望する場合は、hidden backing property メソッドで十分かもしれません。
以上がXML でインターフェイス プロパティをシリアル化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。