2016-10-24 2 views
1

Я попытался сериализовать Dictionary<byte[] , int> с помощью Json.Net, однако он преобразует все байты [] в «System.Byte []». Но если я отменил тип ключа и значение в словаре. Он работает очень хорошо, используя Base64 для сериализации байта []. Мне интересно, почему это не работает для байта []? В чем причина?Почему 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

Автор Json.NET answered что на GitHub:

Вот ожидаемое поведение. Ключ должен быть строкой. Если Json.NET не может найти какой-либо TypeConverter, тогда он вызовет ToString.

Json.NET не находит преобразователь типа, поэтому он вызывает ToString на ключ. ToString по умолчанию возвращает имя типа, которое в данном случае является «System.Byte []».

Значения словарей имеют по-разному поведение. Прогон через логику преобразования, поэтому они могут быть правильно сериализованы как значения, так как есть BinaryConverter. Почему это только известно автору, но я подозреваю, что это связано с производительностью, а также с небольшой потребностью.

Вам лучше не использовать коллекцию в качестве ключа в своей объектной модели. Если ваши ключи являются GUID, просто используйте System.Guid или конвертируйте Guid в строку.