オブジェクトシリアル化にjson.netを使用したシリアル化のシナリオでは、親クラスのポリマーオブジェクトを示す一般的な需要があります。 json.netのtypeNameHandling.autoの設定がこのタスクを簡素化しますが、サブオブジェクトのタイプを示すために「$タイプ」フィールドを導入します。さまざまな理由で、これは望ましくないかもしれません。
チャレンジ
課題は、「$タイプ」フィールドに依存せずにサブオブジェクトのタイプを識別する方法です。 1つの方法は、提供された例コードに示すように、親クラスのインジケーターとしてタイプ情報を保存することです。ただし、これにより、アクセシビリティとデータ管理に関連する制限がもたらされます。
solutionこれらの制限を解決するために、より効果的な解決策は、サブタイプの情報を基本クラスの属性として直接追加することです。これにより、シリアル化がベースクラスに割り当てられると、シリアル化されたサブタイプの列挙が可能になります。 Deeperyの期間中に、カスタムJSONConverterを使用してJSONデータを一時オブジェクトにロードし、「タイプ」属性に基づいて適切なサブクラスを決定し、それに応じてカウンターシリアル化を実行できます。 詳細を実装してください
カスタムサブタイプの列挙の作成と、タイプをサブタイプにマッピングする辞書の実現。 SubtypeClassbaseベースクラスには、辞書を使用してサブタイプに戻る型属性が含まれています。
subtypeclasssconverterクラスは、デリバティブの原因となるjsonconverterとして機能します。 JSONオブジェクトの「タイプ」プロパティをチェックし、対応するサブタイプを取得し、既存または新しいインスタンスの対応するサブクラスを埋めます。 この方法を採用することにより、json.netシリアル化と派生化された多型サブオブジェクトを使用して、データ表現の柔軟性と制御可能性を確保することなく、「$タイプ」フィールドを導入できます。
以上が「$type」フィールドを使用せずにJson.Netで多態的な子オブジェクトをシリアル化する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。