序列化无符号整数(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();
}
}
因此,在JSON中编码64位整数(有符号或其他)可能会导致精度损失,如果它通过任何按照标准处理它的代码。正如在JSON.net中看到的那样,它也可能破坏那些没有正确实现标准的代码,而是假设人们不会尝试做容易失败的事情。
没错,在这种情况下,JSON.Net不会处理大于long.MaxValue
的值。
除了修改库的源代码之外,我没有找到任何方法来修改这种行为。作为一种变通方法,您可以将其反序列化为decimal[]
,然后将其转换为ulong[]
。