2016-10-24 7 views
1

Json.Netを使ってDictionary<byte[] , int>をシリアル化しようとしましたが、すべてのbyte []を "System.Byte []"に変換しました。しかし、もし私が辞書のキーと値のタイプを逆にしたら。これは、Base64を使ってbyte []をシリアライズするのに非常にうまく動作します。なぜ私はバイト[]キーのために動作しないのだろうか?背後にある理由は何ですか?以下は 辞書キーのときにJson.Netがバイト[]を正しくシリアル化しないのはなぜですか?

は、私が試したコードです:

 var dict1 = new Dictionary<byte[], int> 
     { 
      [Guid.NewGuid().ToByteArray()] = 1, 
      [Guid.NewGuid().ToByteArray()] = 2 
     }; 
     string dict1Json = JsonConvert.SerializeObject(dict1); 
     Console.WriteLine(dict1Json); 
     //{ "System.Byte[]":1,"System.Byte[]":2} 

     var dict2 = new Dictionary<int, byte[]> 
     { 
      [1] = Guid.NewGuid().ToByteArray(), 
      [2] = Guid.NewGuid().ToByteArray() 
     }; 
     var dict2Json = JsonConvert.SerializeObject(dict2); 
     Console.WriteLine(dict2Json); 
     //{ "1":"JgrYtch/6Eq3Nyoe8pnnpg==","2":"KbfVMzjz20yCYvc9FiVKKA=="} 

答えて

2

GitHubの上Json.NET answeredの著者:

振る舞いを期待されます。キーは文字列でなければなりません。 Json.NETがTypeConverterを見つけられない場合は、ToStringを呼び出します。

Json.NETはタイプコンバータを検出していないため、キーのToStringを呼び出します。 ToStringはデフォルトで型の名前を返します。この場合は "System.Byte []"です。

辞書の値は異なる動作をします。変換スルー・ロジックは、BinaryConverterがあるため、値として適切にシリアル化できる理由です。なぜこれが著者にしか知られていないのですが、少し必要な機能だけでなくパフォーマンスにも関係していると思います。

オブジェクトモデルでは、コレクションをキーとして使用しない方がよい場合があります。あなたのキーがGUIDの場合は、System.Guidを使用するか、Guidを文字列に変換してください。

関連する問題