2012-02-20 15 views
6

serializing एक पार्सर त्रुटि जब एक ULONG सरणी क्रमानुसार करने की कोशिश कर रही है, Json.NET पुस्तकालय नहीं है पता चल सके कि पूर्णांक हस्ताक्षर किए या अहस्ताक्षरित है की तरह लग रहा है, किसी के लिए इसके कामकाज के बारे में पता है? या कोई अन्य .NET जेसन लाइब्रेरी जो हस्ताक्षरित int को संभाल सकता है?Json.NET दुर्घटनाओं जब अहस्ताक्षरित पूर्णांक (Ulong) सरणी

* संपादित करें: नीचे कोड; * यह ठीक से क्रमबद्ध करता है, लेकिन जब इसकी deserializing यह एक त्रुटि फेंकता है; ऐसा लगता है कि यह हस्ताक्षरित 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(); 
      } 
     } 
+0

आपको क्या सटीक त्रुटि मिल रही है? क्या आप अपने कोड के प्रासंगिक बिट्स के साथ स्टैक ट्रेस भी पोस्ट कर सकते हैं? – svick

+0

यह शायद आपका कोड है। आप इसे क्यों पोस्ट नहीं करते? –

+1

मैंने अभी कोड –

उत्तर

6

आप सही हैं, JSON.Net मूल्यों इस मामले में long.MaxValue से बड़ा संभाल नहीं करता है।

मुझे लाइब्रेरी के स्रोत कोड को संशोधित करने के अलावा उस व्यवहार को संशोधित करने का कोई तरीका नहीं मिला। एक कामकाज के रूप में, आप इसे decimal[] के रूप में deserialize कर सकते हैं और फिर इसे ulong[] में परिवर्तित कर सकते हैं।

+1

हाँ उदासी यह JSON.Net में एक सीमा हो रहा है, मुझे लगता है कि एक दशमलव [] करने के लिए इसे कास्टिंग के अपने समाधान अब के लिए क्या करना होगा, धन्यवाद एक बहुत :-) –

+0

@svick आप साझा कृपया सकते हैं वास्तव में JSON.Net करने के लिए अपने संशोधनों Ulong राउंड ट्रिपिंग (और JSON मानक तोड़ने) की अनुमति के लिए क्या कर रहे थे? मुझे पुस्तकालय के एक संस्करण की भी आवश्यकता है जो यह करता है। –

+0

@OmerRaviv क्षमा करें, मुझे लगता है कि कोड अब और नहीं है (और मुझे यकीन है कि मैं कभी भी नहीं कर रहा हूँ, यह संभव है मैं सिर्फ कोड को देखा है, लेकिन वास्तव में इसे संशोधित नहीं किया)। – svick

7

ECMA-262, जिस मानक पर जेएसओएन आधारित है, खंड 4.3.1 9 में निर्दिष्ट करता है कि संख्या मान आईईईई डबल-परिशुद्धता फ्लोटिंग पॉइंट मान हैं, जिन्हें आम तौर पर सी-जैसी भाषाओं में "डबल" प्रकार के रूप में देखा जाता है। 64 बिट पूर्णांक के सभी संभावित मानों का प्रतिनिधित्व करने के लिए यह एन्कोडिंग पर्याप्त सटीक नहीं है।

इसलिए, जेएसओएन में 64 बिट पूर्णांक (हस्ताक्षरित या अन्यथा) एन्कोडिंग से सटीकता में नुकसान हो सकता है यदि यह किसी भी कोड से गुज़रता है जो मानक को ध्यान में रखते हुए संसाधित करता है। जैसा कि JSON.net में देखा गया है, यह कोड भी तोड़ सकता है जो मानक को सही ढंग से कार्यान्वित नहीं करता है, बल्कि यह मानता है कि लोग विफलता-प्रवण चीजों को करने की कोशिश नहीं करेंगे।