serialize serializar objeto newtonsoft deserializar deserialización convertir clase c# javascript json json.net

c# - objeto - Json.NET se bloquea al serializar una matriz de enteros sin signo(ulong)



serializar y deserializar xml c# (2)

Al obtener un error de analizador al intentar serializar una matriz ulong, parece que la biblioteca Json.NET no verifica si el entero está firmado o no; ¿Alguien sabe de una solución para esto? o cualquier otra biblioteca .NET Json que pueda manejar int sin firmar?

* EDITAR: código debajo; * Se serializa bien, pero cuando se deserializa arroja un error; Parece que no sirve para que el int sin firmar vea el rastro de la pila;

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(); } }


Tiene razón, JSON.Net no maneja valores mayores que long.MaxValue en este caso.

No encontré ninguna manera de modificar ese comportamiento, excepto modificando el código fuente de la biblioteca. Como solución alternativa, puede deserializarla como decimal[] y luego convertirla en ulong[] .


ECMA-262 , el estándar en el que se basa JSON, especifica en la sección 4.3.19 que los valores numéricos son valores de coma flotante de doble precisión IEEE, comúnmente vistos como el tipo "doble" en los lenguajes tipo C. Esta codificación no es suficientemente precisa para representar todos los valores posibles de enteros de 64 bits.

Por lo tanto, la codificación de enteros de 64 bits (firmados o no) en JSON puede conducir a una pérdida de precisión si pasa a través de cualquier código que lo procese de acuerdo con el estándar. Como se ve en JSON.net, también podría romper el código que no implementa correctamente el estándar, sino que asume que las personas no intentarán hacer cosas propensas a fallas.