2012-02-20 14 views
6

Ottenere un errore di parser quando si tenta di serializzare un array ulong, sembra che la libreria Json.NET non stia controllando se il numero intero è firmato o non firmato; qualcuno sa di una soluzione alternativa per questo? o qualsiasi altra libreria .NET Json in grado di gestire int unsigned?Json.NET si arresta in modo anomalo durante la serializzazione di array interi non numerati (ulong)

* MODIFICA: codice sotto; * Serializza bene, ma quando deserializza genera un errore; Sembra che non soddisfi l'int unsigned guardando la traccia dello stack;

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

Qual è l'errore esatto che stai ottenendo? Puoi anche pubblicare la traccia dello stack, insieme ai bit rilevanti del tuo codice? – svick

+0

Probabilmente è il tuo codice. Perché non lo pubblichi? –

+1

Ho appena postato il codice –

risposta

6

Hai ragione, JSON.Net non gestisce i valori più grandi di long.MaxValue in questo caso.

Non ho trovato alcun modo per modificare tale comportamento, tranne modificando il codice sorgente della libreria. Per ovviare al problema, è possibile deserializzare come decimal[] e convertirlo in ulong[].

+1

Sì purtroppo sembra essere una limitazione in JSON.Net, penso che la tua soluzione di lanciarlo su un decimale [] dovrà per ora, grazie molto :-) –

+0

@svick Potresti per favore condividere quali sono esattamente le tue modifiche a JSON.Net per consentire un ulteriore round trip (e rompere lo standard Json)? Ho anche bisogno di una versione della libreria che lo faccia. –

+0

@OmerRaviv Spiacente, non ho più quel codice (e non sono sicuro di averlo mai avuto, è possibile che ho appena guardato il codice, ma in realtà non lo ho modificato). – svick

7

ECMA-262, lo standard su cui è basato JSON, specifica nella sezione 4.3.19 che i valori numerici sono valori in virgola mobile a precisione doppia IEEE, comunemente visti come il tipo "doppio" nei linguaggi di tipo C. Questa codifica non è sufficientemente precisa per rappresentare tutti i possibili valori di interi a 64 bit.

Pertanto, la codifica di interi a 64 bit (firmati o meno) in JSON può causare una perdita di precisione se passa attraverso qualsiasi codice che lo elabora in conformità con lo standard. Come visto in JSON.net, potrebbe anche infrangere il codice che non implementa correttamente lo standard, ma piuttosto presuppone che le persone non proveranno a fare cose a rischio.

Problemi correlati