为什么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.当byte[]是字典键时,不能正确序列化它

Json的作者。. NET在GitHub上回答:

这是预期的行为。键必须是字符串。如果Json。. NET不能找到任何类型转换,那么它将调用ToString。

Json。NET没有找到类型转换器,所以它在键上调用ToStringToString默认返回类型的名称,在本例中为"System.Byte[]"。

字典的值有不同的行为。通过转换逻辑运行,这就是为什么它们可以被正确地序列化为值,因为有一个BinaryConverter。为什么只有作者知道,但我怀疑这与性能有关,也是一个不太需要的功能。

最好不要在对象模型中使用集合作为键。如果您的键是Guid,那么只需使用System.Guid或将Guid转换为字符串。