序列化无符号整数(ulong)数组时,Json.NET崩溃

本文关键字:Json NET 崩溃 数组 无符号整数 ulong 序列化 | 更新日期: 2023-09-27 18:25:04

尝试序列化ulong数组时出现语法分析器错误,Json.NET库似乎没有检查整数是有符号的还是无符号的;有人知道解决这个问题的办法吗?或者任何其他可以处理无符号int的.NET Json库?

*编辑:下面的代码*它可以很好地序列化,但在反序列化时会抛出错误;从堆栈跟踪来看,它似乎没有满足无符号int;

NewTonsoft.Json.JsonReaderException : {"JSON integer 18446744073709551615 is too large or small for an Int64."}
Value was either too large or too small for an Int64.
   at System.Number.ParseInt64(String value, NumberStyles options, NumberFormatInfo numfmt)
   at System.Convert.ToInt64(String value, IFormatProvider provider)
   at Newtonsoft.Json.JsonTextReader.ParseNumber() in d:'Development'Releases'Json'Working'Src'Newtonsoft.Json'JsonTextReader.cs:line 1360
   class Program
        {
            static void Main(string[] args)
            {
                string output = JsonConvert.SerializeObject(new ulong[] {ulong.MinValue, 20, 21, 22, ulong.MaxValue});
                Console.WriteLine(output);
                ulong[] array = JsonConvert.DeserializeObject<ulong[]>(output);
                Console.WriteLine(array);
                Console.ReadLine();
            }
        }

序列化无符号整数(ulong)数组时,Json.NET崩溃

JSON所基于的标准ECMA-262在第4.3.19节中规定,数值是IEEE双精度浮点值,在类C语言中通常被视为"double"类型。这种编码不足以精确地表示64位整数的所有可能值。

因此,在JSON中编码64位整数(有符号或其他)可能会导致精度损失,如果它通过任何按照标准处理它的代码。正如在JSON.net中看到的那样,它也可能破坏那些没有正确实现标准的代码,而是假设人们不会尝试做容易失败的事情。

没错,在这种情况下,JSON.Net不会处理大于long.MaxValue的值。

除了修改库的源代码之外,我没有找到任何方法来修改这种行为。作为一种变通方法,您可以将其反序列化为decimal[],然后将其转换为ulong[]