私はDataContractJsonSerializer
でJSONにシリアル化しているオブジェクトツリーを持っています。 Dictionary<TKey, TValue>
はシリアル化されますが、私はマークアップを好きではない - の項目は次のようにレンダリングされません。DataContractJsonSerializerでJSONに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"
}]
醜い、それはないです?
ISerializable
を実装したカスタムオブジェクトに汎用ディクショナリをラップし、GetObjectData
メソッドでカスタムシリアル化を実装しています(それには3行しかかかりません)。
Dictionary<TKey, TValue>
から派生することはできませんので、私はプライベート
Dictionary<TKey, TValue>
フィールドに適用されて、私のカスタムクラス内のすべてのロジック(
Add
、
Clear
など)を実装しています。私のカスタムオブジェクトを使用しているときには、すべての汎用ディクショナリ機能を自由に使用できるため、継承が望ましいでしょう。
継承の問題は、Dictionary<TKey, TValue>
が独自にISerializable
を実装することで、DataContractJsonSerializer
は、私は私のカスタムクラスから明示的ISerializable
を実装した場合でも、このように、この実装を好むようだ:
public class MyClass : Dictionary<string, object>, ISerializable
{
public override void GetObjectData(SerializationInfo info,
StreamingContext context)
}
は、私が実際にその驚きましたこれは明示的なインターフェイス実装を明示的に使用することなく、同じインターフェイスを2回実装することができるので可能です。そのため、ブログの投稿で詳細を分析しました。about multiple interface implementation
したがって、
((ISerializable)obj).GetObjectData(...)
が、それは明らかではありません。
((ISerializable)((Dictionary<,>)obj)).GetObjectData(...)
かを - 私はそこに行った実験によれば、シリアライザは関係なく、内部的に使用される鋳物の種類、ISerializableの私の実装を呼び出してはなりません結果として生じるJSONで、シリアライザKeyValuePair<TKey, TValue>
がまだ呼び出されているのがわかります。私が行方不明になっていることは何ですか?
更新: これまでの回答とコメントは、回避策を提案するだけです。結局、それはオリジナルのデザインで動作させる
- と私は、シリアル化のロジックを変更するつもりはない。私は2つの目的を持って、私はこの質問を尋ねると非常によくその作品の回避策を持っていることに注意しましたそのためには、多くのコードとロジックが必要です。
DataContractJsonSerializer
は私のシリアライゼーションコードを使用していないのはなぜですか?私が言及したブログ記事に見られるように、インターフェイスの実装と継承に関するあらゆる種類の実験を行いました。私はプロセスのすべての面倒を把握していると確信していました。この問題で何が起こっているのか理解していないと困りますケース
あなたがIEnumerableをクラスと辞書とあなたのISerializableのimplentationをラップすることができたようです。辞書から継承しようとするよりもはるかに少ない仕事。 –
あなたが好きなように辞書をシリアライズするので、単に 'JavaScriptSerializer'を使うこともできます。 –
@RitchMelton - 辞書を継承するのは大変な作業ではありませんが、IEnumerableを実装してメンバ辞書のgetEnumaratorを一目で返すことは、私の回避策よりも優れていることを認めなければなりません - – Vroomfundel