2011-02-03 9 views
20

नेट के Deserilization त्रुटियों इस तरह उदाहरण कुछ के लिए काफी सामान्य हैं:.NET में deserialization त्रुटियों को डीबग कैसे करें?

System.ArgumentException: प्रकार 'System.Uri' की वस्तु नहीं बदला जा सकता 'System.String' टाइप करने के लिए।

यह स्पष्ट है कि हम एक वस्तु में एक संपत्ति के प्रकार बदल लेकिन इस धारावाहिक वस्तु में 10-15 विभिन्न वर्गों की तरह हैं, तो यह जो एक हम बदल यह पता लगाने की बहुत मुश्किल है या जो इस में गड़बड़ प्रतिबद्ध ।

क्या इस संपत्ति के बारे में जानकारी प्राप्त करने के लिए वैसे भी है कि किस श्रेणी में कक्षा (या कम से कम कक्षा) वास्तव में इस त्रुटि का कारण बनती है? क्या ऐसा करने के लिए कोई बाहरी उपकरण या ज्ञात तरीके हैं?

पीएस किसी ने मुझे यह बताने से पहले कि मुझे बाइनरी सीरिएलाइज़र का उपयोग क्यों नहीं करना चाहिए या पिछली संगतता के लिए मुझे एक्स, वाई इत्यादि क्यों चाहिए, कृपया उन पर सलाह सहेजें। मैं उन सभी के बारे में जानता हूं लेकिन यह सवाल नहीं है।

+4

आप InnerException देखा था अगर तुम न अधिक जानकारी है? – DesignFirst

+0

10-15 डीबगिंग उद्देश्यों के लिए एक बड़ी संख्या नहीं है; मुझे उस हाथ से –

+0

@Marc Gravell डीबग करने का एक आसान तरीका नहीं पता: मुझे लगता है कि @dr।बुराई का मतलब है कि उदाहरण के लिए deserialized में 10-15 अन्य विशिष्ट वर्गों के संदर्भ हैं, जिनमें से सभी (रूट सहित) में 'एन' गुण हो सकते हैं (यहां तक ​​कि एक वर्ग के साथ, आपके पास' एन' गुण हैं) जो कि अनिश्चित है, ताकि संभावित रूप से गुजरने के लिए गुणों की एक बड़ी संख्या हो सकती है। – casperOne

उत्तर

1

कुछ अलग-अलग चीजें हैं जो आप कर सकते हैं, उनमें से कोई भी महान नहीं है। विशेष रूप से बाइनरी serialization के साथ। आप ISerializable इंटरफेस के साथ कस्टम सीरियलाइजेशन हैंडलिंग जोड़ सकते हैं, जो आपको डीबगर में deserialization प्रक्रिया के माध्यम से कदम उठाने की अनुमति देगा।

क्या आपने विकास/डिबगिंग उद्देश्यों के लिए एक्सएमएल क्रमबद्धता पर स्विच करने पर विचार किया है? कुछ और हुक हैं जिन्हें आप एक्सएमएल सीरियलाइजेशन के साथ उपयोग कर सकते हैं। लेकिन ऐसा लगता है कि यह आपके लिए काम नहीं करेगा, क्योंकि आप शायद दूरस्थ रिमोट इंटरफ़ेस या डिस्क पर संग्रहीत पुराने बाइनरी डेटा से निपट रहे हैं जिसे आपको पढ़ने की आवश्यकता है।

लेकिन बदले गए प्रकार के साथ विधि के लिए आपके स्रोत नियंत्रण प्रणाली के लॉग को देखना भी आसान होगा।

+0

हम वर्तमान में समस्या को ठीक करने के लिए पिछले संस्करण की जांच करने की प्रक्रिया में हैं, हालांकि मैं शायद मेरी मदद करने के लिए एक चालाक उपकरण ढूंढने की उम्मीद कर रहा था। हो सकता है कि जब मैं इसे अपने डीएलएल देता हूं तो यह वस्तु को निर्जलित और कल्पना कर सकता है। बहुत आशावादी, आह? :) –

+0

हाँ, वहां कई जगहें हैं जहां नेट अपवादों में बहुत कम या कोई जानकारी नहीं है। असली शर्म की बात है। जब आपके पास कस्टम कक्षाएं होती हैं तो कॉन्फ़िगरेशन क्लासेस कुछ बहुत ही गुप्त अपवाद संदेश भी फेंक देते हैं। कम से कम आप इसे एक प्रकार का परिवर्तन जानते हैं, जो आपको एक अच्छा सिर शुरू करता है। – MonkeyWrench

8

यदि आप फ्रेमवर्क कोड में डिबगिंग सक्षम करते हैं (this लिंक देखें) और फिर ctrl + shift + e दबाएं और सभी प्रबंधित कोड अपवादों का चयन करें, तो असफल वास्तविक स्रोत रेखा में त्रुटि दिखाई देगी। उस बिंदु पर deserialize करने की कोशिश कर रहा था वस्तु का क्या हिस्सा पता लगाने के लिए आप स्टैक ट्रेस का उपयोग करने में सक्षम होना चाहिए।

यह आसान नहीं है, लेकिन इस तरह हम इसे समाप्त कर चुके हैं।

+0

ऊपर बताए गए पहले मौके अपवादों और प्रतीकों का उपयोग करना एक महान दृष्टिकोण है। –

+0

ठीक है यह एक अच्छा विचार की तरह लगता है, मैं इसे एक की जांच करूँगा। –

1

इनर स्टैक ट्रेस को देखकर उपयोगी हो सकता है। सीरिएलाइज़र एक वर्ग को विशेष रूप से उस प्रकार को संभालने के लिए उत्पन्न करता है जिसे आप धारावाहिक/deserialize करना चाहते हैं।

बस स्टैकट्रैक में शामिल कार्यों के फ़ंक्शन नामों को देखकर आप ट्रैक कर सकते हैं कि कौन सा नोड नोड टूट रहा है।

यह समस्या को झूठ बोलने में मदद करता है, खासकर बड़ी जटिल XML फ़ाइलों के साथ।

उदाहरण:

at System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal) 
    at System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info) 
    at System.Xml.XmlConvert.ToInt32(String s) 
    at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderXML.Read13_Item(Boolean isNullable, Boolean checkType) //Tells you the issue is on the RootNodeSubNodeSubSubNode on an item withing it. 
    at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderXML.Read17_RootNodeSubNodeSubSubNode(Boolean isNullable, Boolean checkType) 
    at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderXML.Read26_RootNodeSubNode(Boolean isNullable, Boolean checkType) 
    at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderXML.Read50_RootNode(Boolean isNullable, Boolean checkType) 
    at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderXML.Read51_RootNode() 
+2

यह कैसे पता चलेगा कि यह किस विशेषता का उपयोग कर रहा था। मुझे इनपुट स्ट्रिंग मिल रही है सही प्रारूप में नहीं था। मेरे पास बड़ी एक्सएमएल फ़ाइल है जिसमें कई विशेषताएं हैं। मैं जानना चाहता हूं कि किसने समस्या पैदा की – Ziggler

संबंधित मुद्दे