を使用して JSON にシリアル化するオブジェクト ツリーがありますDataContractJsonSerializer
。Dictionary<TKey, TValue>
シリアル化されますが、マークアップが好きではありません-アイテムは次のようにレンダリングされません:
{key1:value, key2:value2}
KeyValuePair<TKey, TValue>
シリアル化されたオブジェクトの配列のようなものです。
[{
"__type":"KeyValuePairOfstringanyType:#System.Collections.Generic",
"key":"key1",
"value":"value1"
},
{
"__type":"KeyValuePairOfstringanyType:#System.Collections.Generic",
"key":"key2",
"value":"value2"
}]
醜いですね。
そのため、汎用 Dictionary を を実装するカスタム オブジェクトにラップすることでこれを回避しISerializable
、カスタム シリアル化をGetObjectData
メソッドに実装します (わずか 3 行で済みます)。
ここでの問題 - クラスを から派生させることができないため、Dictionary<TKey, TValue>
すべてのロジック ( 、 など) をカスタム クラスに実装Add
しClear
、プライベートDictionary<TKey, TValue>
フィールドに適用します。カスタム オブジェクトを使用するときに、すべての一般的な Dictionary 機能を自由に使用できるため、継承が望ましいでしょう。
継承の問題は、独自にDictionary<TKey, TValue>
実装することであり、次のようにカスタム クラスから明示的に実装したとしても、この実装を好むようです。ISerializable
DataContractJsonSerializer
ISerializable
public class MyClass : Dictionary<string, object>, ISerializable
{
public override void GetObjectData(SerializationInfo info,
StreamingContext context)
}
明らかに明示的なインターフェイス実装を使用できなくても、同じインターフェイスを 2 回実装できるため、これが可能であることに実際に驚きました。そのため、複数のインターフェイスの実装に関するブログ投稿で状況をより詳細に分析しました。
したがって、そこで行った実験によると、内部で使用されているキャストのタイプに関係なく、シリアライザーは ISerializable の実装を呼び出す必要があります-
((ISerializable)((Dictionary<,>)obj)).GetObjectData(...)
また:
((ISerializable)obj).GetObjectData(...)
KeyValuePair<TKey, TValue>
しかし、シリアライザーがまだ呼び出されている結果のJSONでわかるように、それは明らかに起こっていません。私が行方不明になっていると何が起こっているのでしょうか?
更新: これまでに得た回答とコメントは、回避策を示唆しているだけです。ただし、非常にうまく機能する回避策があることに注意してください。この質問をすることで、2つの目的があります。
最終的には元の設計で動作するようにします。そのためだけにシリアライゼーション ロジックを変更するつもりはありません。多くのコードとロジックが依存しています。
なぜシリアライゼーション コードを使用しないのかという謎を解明するために、
DataContractJsonSerializer
参照したブログ投稿に見られるように、インターフェイスの実装と継承についてあらゆる種類の実験を行い、すべての実装を把握していると確信していました。プロセスから外れたので、この場合何が起こっているのか理解できずに困っています