2012-02-20 29 views
6

Nhận lỗi trình phân tích cú pháp khi cố gắng tuần tự hóa một mảng ulong, trông giống như thư viện Json.NET không kiểm tra nếu số nguyên được ký hoặc chưa ký; bất kỳ ai biết về một cách giải quyết cho việc này? hoặc bất kỳ thư viện .NET Json nào khác có thể xử lý int không dấu của?Json.NET treo khi tuần tự hóa dãy số nguyên không dấu (ulong)

* EDIT: mã bên dưới; * Nó tuần tự tốt, nhưng khi deserializing nó ném một lỗi; Dường như nó không phục vụ cho các int không dấu từ nhìn vào dấu vết ngăn xếp;

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

Lỗi chính xác bạn đang gặp phải là gì? Bạn cũng có thể đăng theo dõi ngăn xếp, cùng với các bit có liên quan của mã của bạn không? – svick

+0

Đó có thể là mã của bạn. Tại sao bạn không đăng nó? –

+1

Tôi vừa mới đăng mã số –

Trả lời

6

Bạn nói đúng, JSON.Net không xử lý các giá trị lớn hơn long.MaxValue trong trường hợp này.

Tôi không tìm thấy cách nào để sửa đổi hành vi đó, ngoại trừ bằng cách sửa đổi mã nguồn của thư viện. Để giải quyết sự cố này, bạn có thể deserialize nó là decimal[] và sau đó chuyển đổi thành ulong[].

+1

Thật đáng buồn khi nó có vẻ là một hạn chế trong JSON.Net, tôi nghĩ rằng giải pháp của bạn để đưa nó vào thập phân [] sẽ phải làm ngay bây giờ, cảm ơn rất nhiều :-) –

+0

@svick Bạn có thể chia sẻ chính xác những gì đã được sửa đổi của bạn để JSON.Net để cho phép ulong round-vấp (và phá vỡ các tiêu chuẩn Json)? Tôi cũng cần một phiên bản của thư viện thực hiện điều này. –

+0

@OmerRaviv Xin lỗi, tôi không có mã đó nữa (và tôi không chắc mình đã từng có, có thể tôi chỉ xem mã, nhưng không thực sự sửa đổi mã). – svick

7

ECMA-262, tiêu chuẩn dựa trên JSON, chỉ định trong phần 4.3.19 giá trị số là giá trị điểm nổi chính xác kép của IEEE, thường được xem là loại "gấp đôi" trong ngôn ngữ giống C. Mã hóa này không đủ chính xác để thể hiện tất cả các giá trị có thể có của các số nguyên 64 bit.

Do đó, mã hóa các số nguyên 64 bit (đã ký hoặc cách khác) trong JSON có thể dẫn đến mất chính xác nếu nó vượt qua bất kỳ mã nào xử lý mã tuân thủ tiêu chuẩn. Như đã thấy trong JSON.net, nó cũng có thể phá vỡ mã mà không thực hiện đúng tiêu chuẩn, nhưng đúng hơn là giả định rằng mọi người sẽ không cố gắng làm những thứ không dễ bị lỗi.

Các vấn đề liên quan