2009-06-30 15 views
33

What is the correct way to make a custom .NET Exception serializable?
और Are all .NET Exceptions serializable? का जिक्र करते हुए ...मुझे हमेशा अपने अपवाद [serializable] क्यों बनाना चाहिए? (.NET)

क्यों मेरी अपवाद serializable होना चाहिए?
किसी ने कहा कि "इसे एक बग माना जा सकता है" यदि किसी तृतीय पक्ष लाइब्रेरी द्वारा परिभाषित कस्टम अपवाद, क्रमिक नहीं है। क्यूं कर?

इस संबंध में अन्य वर्गों के अलावा अपवाद अलग क्यों हैं?

उत्तर

48

क्योंकि आपके अपवादों को विभिन्न ऐपडोमेन्स के बीच मार्शल करने की आवश्यकता हो सकती है और यदि वे (ठीक से) क्रमबद्ध नहीं हैं तो आप कीमती डिबगिंग जानकारी खो देंगे। अन्य वर्गों के विपरीत, आप पर नियंत्रण नहीं होगा कि आपका अपवाद मार्शल किया जाएगा - यह होगा।


जब मेरा मतलब है "आप नियंत्रण नहीं होगा" मेरा मतलब है कक्षाएं आप बनाते हैं आम तौर पर अस्तित्व की एक निश्चित जगह है और अस्तित्व सर्वविदित है कि। यदि यह वापसी मूल्य है और कोई इसे किसी अलग ऐपडोमेन (या किसी दूसरी मशीन पर) कॉल करने का प्रयास करता है तो उन्हें एक गलती मिल जाएगी और केवल यह कह सकती है कि "इस तरह इसका उपयोग न करें।" कॉलर जानता है कि उन्हें इसे एक प्रकार में परिवर्तित करना है जिसे क्रमबद्ध किया जा सकता है (विधि कॉल को लपेटकर)। हालांकि, अगर पकड़े नहीं जाते हैं तो अपवादों को बहुत ऊपर तक बुलबुला किया जाता है, इसलिए वे ऐपडोमेन सीमाओं को पार कर सकते हैं जिन्हें आप नहीं जानते थे। आपके कस्टम एप्लिकेशन अपवाद को एक अलग ऐपडोमेन में गहराई से 20 स्तर मुख्य() पर अपवाद की सूचना दी जा सकती है और इसके साथ कुछ भी आपके लिए एक क्रमिक अपवाद में परिवर्तित करने जा रहा है।

+0

यह वास्तव में एक अच्छा जवाब है। – Cheeso

+2

क्या आप एक विशिष्ट स्थिति/उदाहरण के बारे में सोच सकते हैं जिसमें वास्तव में यह हो सकता है? – Sam

0

Talljoe के जवाब के अलावा, अपने अपवाद वेब सेवा भर में रूप में अच्छी तरह से पारित कर दिया जा सकता है, इस मामले में अपवाद serializable/deserializable होने की जरूरत है, तो यह वेब सेवा

+3

जेफरी: आप लगभग सही हैं। जब किसी अपवाद को वेब सेवा पर "भेजा" दिया जाता है, तो सभी को क्रमशः क्रमबद्ध नहीं किया जाता है। इसे वास्तव में एक एसओएपी दोष में परिवर्तित किया जा रहा है, इसलिए पूर्ण निष्ठा की आवश्यकता नहीं है। इसके अलावा, पुराने एएसएमएक्स सेवाओं में उपयोग किए गए एक्सएमएल सीरिएलाइज़र [सीरियलज़ेबल] पर बहुत कम या कोई ध्यान नहीं देता है। –

0

मैं द्वारा एक्सएमएल में बदल सकता है और संचरित लगता है कि सभी वर्गों के लिए डिफ़ॉल्ट Serializable होना चाहिए जब तक कि वे एक वर्ग नहीं है जो स्पष्ट रूप से serializable नहीं है। यह सिर्फ परेशान है कि कक्षा को स्थानांतरित करने में सक्षम न हो क्योंकि कुछ डिजाइनर इसके बारे में नहीं सोचते थे।

"अंतिम" के साथ एक ही चीज़, सभी चर डिफ़ॉल्ट रूप से "अंतिम" होना चाहिए जबतक कि आप विशेष रूप से कहें कि वे "उत्परिवर्तनीय" हैं।

इसके अलावा, मुझे यकीन नहीं है कि यह एक चर है जो निजी नहीं है, समझ में आता है।

ओह ठीक है, मुझे अपनी खुद की भाषा तैयार करने की आवश्यकता है।

लेकिन उत्तर यह है कि आप नहीं जानते कि आपका अपवाद कैसे उपयोग किया जाएगा और उन्हें रिमोट कॉल्स में फेंकने में सक्षम माना जाता है।

+1

@ बिल: वैकल्पिक रूप से, डिजाइनर _did_ इसके बारे में सोचता है, लेकिन serialization का समर्थन करने के खिलाफ फैसला किया।उदाहरण के लिए, एक वर्ग को क्रमबद्ध करने का उपयोग कैसे किया जाएगा जो देशी संसाधनों को संभालने में सक्षम है, या यहां तक ​​कि केवल खुली धाराएं? –

+0

अपवादों को ऐसा करने की आवश्यकता नहीं है। साथ ही, मैंने जिन 3 वर्गों में भाग लिया है और पिछले महीने (अपवाद सहित) में क्रमबद्ध करना चाहते थे, उनके पास ऐसा कोई प्रतिबंध नहीं था। यह उस समिति द्वारा इस तरह से नहीं पहचाना गया था जिसने अपरिवर्तनीय एपीआई –

+1

ओह बनाया था, और डिफ़ॉल्ट सुझाव के अनुसार मेरे धारावाहिक के लिए, यदि आपके पास ऐसी स्थितियां थीं, तो संसाधनों को "अनुक्रमिक" चिह्नित किया जाएगा जो आपकी कक्षा तक पहुंच जाएगा जब तक कि आप उन्हें "क्षणिक" के रूप में टैग नहीं करते हैं, तब तक यह अनावश्यक बनाते हैं, इसलिए यह ठीक काम करेगा - वर्तमान प्रणाली से बेहतर। –

-1

एक और जगह जहां वस्तुओं को क्रमबद्ध करने की आवश्यकता है Asp.Net सत्र है। हम सत्र में अंतिम अपवाद संग्रहीत करते हैं और धारावाहिक अपवादों को उनके विवरण को धारावाहिक के रूप में संग्रहीत करने के लिए अतिरिक्त अनुवाद की आवश्यकता नहीं होती है (आंतरिक अपवाद निर्दिष्ट करने के रूप में आंतरिक सहायता नहीं करता है)

+0

यह एक कारण की तरह लगता है कि अपवादों को आपके * उपयोग के मामले में sdrializable क्यों होना चाहिए, लेकिन यह वास्तव में सामान्य प्रश्न का उत्तर नहीं देता है। – stakx

+0

@stakx, जब आप कोड सही करते हैं, तो आपको विभिन्न उपयोग मामलों पर विचार करना चाहिए, जहां इसका उपयोग किया जा सकता है –

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