为什么Json.当byte[]是字典键时,不能正确序列化它
本文关键字:不能 序列化 字典 Json byte 为什么 | 更新日期: 2023-09-27 18:14:37
我尝试使用Json序列化Dictionary<byte[] , int>
。Net,但是它将所有的byte[]转换为"System.Byte[]"。但是如果我把字典中键和值的类型倒过来。使用Base64序列化byte[]可以很好地工作。我想知道为什么它不工作的字节[]键?这背后的原因是什么?
下面是我试过的代码:
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=="}
Json的作者。. NET在GitHub上回答:
这是预期的行为。键必须是字符串。如果Json。. NET不能找到任何类型转换,那么它将调用ToString。
Json。NET没有找到类型转换器,所以它在键上调用ToString
。ToString
默认返回类型的名称,在本例中为"System.Byte[]"。
字典的值有不同的行为。通过转换逻辑运行,这就是为什么它们可以被正确地序列化为值,因为有一个BinaryConverter
。为什么只有作者知道,但我怀疑这与性能有关,也是一个不太需要的功能。
最好不要在对象模型中使用集合作为键。如果您的键是Guid,那么只需使用System.Guid
或将Guid转换为字符串。