2012-02-20 12 views
6

Al obtener un error de analizador al tratar de serializar una matriz ulong, parece que la biblioteca Json.NET no comprueba 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?Json.NET se bloquea al serializar matriz de enteros sin signo (ulong)

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

¿Cuál es el error exacto que está obteniendo? ¿También puede publicar el seguimiento de la pila, junto con fragmentos relevantes de su código? – svick

+0

Probablemente sea tu código. ¿Por qué no lo publicas? –

+1

Acabo de publicar el código –

Respuesta

6

Tienes 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 deserializarlo como decimal[] y luego convertirlo en ulong[].

+1

Sí, por desgracia, parece ser una limitación en JSON.Net, creo que tu solución de convertirla en un decimal [] tendrá que hacer por ahora, gracias mucho :-) –

+0

@svick ¿Podrías por favor compartir cuáles fueron exactamente tus modificaciones a JSON.Net para permitir ulong round-tripping (y romper el estándar Json)? También necesito una versión de la biblioteca que haga esto. –

+0

@OmerRaviv Lo siento, ya no tengo ese código (y no estoy seguro de haberlo tenido alguna vez, es posible que solo haya mirado el código, pero en realidad no lo haya modificado). – svick

7

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 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 provocar 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.

Cuestiones relacionadas