दिलचस्प पोस्ट
कैसे PHP के साथ एक foreach लूप में लाइनों पंगा लेना Iframe.readyState क्रोम में काम नहीं करता है .Net Framework 4.0 इंस्टालर में .Net Framework 3.5 शामिल है? सी में मैक्रोज़ में कोष्ठकों की आवश्यकता AJAX प्रतिक्रिया के लिए jQuery AJAX मतदान, AJAX परिणाम या JSON सामग्री पर आधारित हैंडलिंग टेम्पलेट्स और विरासत के साथ "इस क्षेत्र में घोषित नहीं" त्रुटि Angular2 में ngShow और ngHide के बराबर क्या है? एक वस्तु सरणी की गहरी प्रतिलिपि एचटीएमएल 5 स्थानीय स्टोरेज में ऑब्जेक्ट संग्रहित करना सिक्का समस्या के लिए संभावित संयोजन की गणना कैसे करें गतिविधि पट्टी एनीमेशन संक्रमण के दौरान एनिमेटिंग से मैं स्टेटस बार और नेविगेशन बार को कैसे रोकूं? कैसे एप्पल आईफोन एसडीके के साथ UIKeyboard आकार पाने के लिए ओपनशैफ्ट: अपने पीसी से पोस्टग्रेस्क्ल से कैसे जुड़ें java Runtime.getRunTime ()। exec और वाइल्डकार्ड? इनपुट शब्द पर ASCII मान प्राप्त करें

कैसे सी # में एक अपवाद वस्तु serialize करने के लिए?

मैं सी # में एक अपवाद ऑब्जेक्ट को सीरियल करना चाहता हूँ। हालांकि, ऐसा लगता है कि यह असंभव है क्योंकि अपवाद वर्ग को [Serializable] के रूप में चिह्नित नहीं किया गया है। क्या उसके आसपास काम करने का कोई तरीका है?

अगर आवेदन के निष्पादन के दौरान कुछ गलत हो जाता है, तो मुझे उस अपवाद के साथ सूचित किया जाना चाहिए जो हुआ।

मेरा पहला पलटा है कि इसे सीरियलाइज़ करना है

Solutions Collecting From Web of "कैसे सी # में एक अपवाद वस्तु serialize करने के लिए?"

मैंने एक कस्टम त्रुटि क्लास बनाने से पहले क्या किया है। यह एक अपवाद के बारे में सभी प्रासंगिक जानकारी का खुलासा करता है और XML सीरियलाइज योग्य है।

 [Serializable] public class Error { public DateTime TimeStamp { get; set; } public string Message { get; set; } public string StackTrace { get; set; } public Error() { this.TimeStamp = DateTime.Now; } public Error(string Message) : this() { this.Message = Message; } public Error(System.Exception ex) : this(ex.Message) { this.StackTrace = ex.StackTrace; } public override string ToString() { return this.Message + this.StackTrace; } } 

[सीरियलज़ेबल ()] विशेषता के साथ एक कस्टम अपवाद क्लास बनाएं यहां एमएसडीएन से लिया गया एक उदाहरण है:

 [Serializable()] public class InvalidDepartmentException : System.Exception { public InvalidDepartmentException() { } public InvalidDepartmentException(string message) : base(message) { } public InvalidDepartmentException(string message, System.Exception inner) : base(message, inner) { } // Constructor needed for serialization // when exception propagates from a remoting server to the client. protected InvalidDepartmentException(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) : base(info, context) { } } 

अपवाद वर्ग को सीरियलज योग्य के रूप में चिह्नित किया गया है और ISerializable को लागू करता है। MSDN देखें: http://msdn.microsoft.com/en-us/library/system.exception.aspx

यदि आप एक्सएमएल XmlSerializer के XmlSerializer XML को सीरियल करना चाहते हैं, तो आप किसी भी ऐसे सदस्यों पर त्रुटिपूर्ण हिट करेंगे जो IDictionary लागू करते हैं। यह XmlSerializer की एक सीमा है, लेकिन वर्ग निश्चित रूप से धारावाहिक है।

एमएससन ने लिखा: "मुझे यकीन नहीं है कि आप अपवाद को क्यों सीरियल करना चाहते हैं …"

मैं एक वेब सेवा के माध्यम से अपवाद को बुलबुला करने के अपवादों को सीरियल कर देता हूं, कॉलिंग ऑब्जेक्ट को डिसेरीलाइज कर सकता है, फिर पुन: लगा सकता है, लॉग कर सकता है या अन्यथा इसे संभाल सकता है

इसे मैने किया है। मैं बस एक सीरियलाइज़ेबल आवरण वर्ग बनाया जो कि आईडीसीज़ को सीरिजियज करने योग्य विकल्प (कीवेल्यू पेअर सरणी) के साथ बदल देता है

 /// <summary> /// A wrapper class for serializing exceptions. /// </summary> [Serializable] [DesignerCategory( "code" )] [XmlType( AnonymousType = true, Namespace = "http://something" )] [XmlRootAttribute( Namespace = "http://something", IsNullable = false )] public class SerializableException { #region Members private KeyValuePair<object, object>[] _Data; //This is the reason this class exists. Turning an IDictionary into a serializable object private string _HelpLink = string.Empty; private SerializableException _InnerException; private string _Message = string.Empty; private string _Source = string.Empty; private string _StackTrace = string.Empty; #endregion #region Constructors public SerializableException() { } public SerializableException( Exception exception ) : this() { setValues( exception ); } #endregion #region Properties public string HelpLink { get { return _HelpLink; } set { _HelpLink = value; } } public string Message { get { return _Message; } set { _Message = value; } } public string Source { get { return _Source; } set { _Source = value; } } public string StackTrace { get { return _StackTrace; } set { _StackTrace = value; } } public SerializableException InnerException { get { return _InnerException; } set { _InnerException = value; } } // Allow null to be returned, so serialization doesn't cascade until an out of memory exception occurs public KeyValuePair<object, object>[] Data { get { return _Data ?? new KeyValuePair<object, object>[0]; } set { _Data = value; } } #endregion #region Private Methods private void setValues( Exception exception ) { if ( null != exception ) { _HelpLink = exception.HelpLink ?? string.Empty; _Message = exception.Message ?? string.Empty; _Source = exception.Source ?? string.Empty; _StackTrace = exception.StackTrace ?? string.Empty; setData( exception.Data ); _InnerException = new SerializableException( exception.InnerException ); } } private void setData( ICollection collection ) { _Data = new KeyValuePair<object, object>[0]; if ( null != collection ) collection.CopyTo( _Data, 0 ); } #endregion } 

यदि आप किसी लॉग के लिए अपवाद को सीरियल करने की कोशिश कर रहे हैं, तो यह करना बेहतर हो सकता है। टॉस्ट्रिंग (), और उसके बाद अपने लॉग को सीरियल करें

लेकिन यह एक ऐसा लेख है कि यह कैसे करना है, और क्यों असल में, आपको अपने अपवाद पर आईएसरिअलजेल लागू करना होगा। अगर यह सिस्टम अपवाद है, तो मेरा मानना ​​है कि उनके पास इंटरफ़ेस लागू है। अगर यह किसी और के अपवाद है, तो आप आईएसएराइलाइज करने योग्य इंटरफ़ेस को कार्यान्वित करने के लिए इसे उपवर्ग कर सकते हैं।

बस किसी और को इस धागा (यह आज के रूप में Google में से एक पृष्ठ पर है) पर ठोकर खाई जाती है, यह XElement (याय, LINQ) ऑब्जेक्ट में Exception ऑब्जेक्ट को सीरियल करने के लिए एक बहुत ही उपयोगी वर्ग है:

http://seattlesoftware.wordpress.com/2008/08/22/serializing-exceptions-to-xml/

कोड पूर्णता के लिए शामिल है:

 using System; using System.Collections; using System.Linq; using System.Xml.Linq; public class ExceptionXElement : XElement { public ExceptionXElement(Exception exception) : this(exception, false) { ; } public ExceptionXElement(Exception exception, bool omitStackTrace) : base(new Func<XElement>(() => { // Validate arguments if (exception == null) { throw new ArgumentNullException("exception"); } // The root element is the Exception's type XElement root = new XElement(exception.GetType().ToString()); if (exception.Message != null) { root.Add(new XElement("Message", exception.Message)); } // StackTrace can be null, eg: // new ExceptionAsXml(new Exception()) if (!omitStackTrace && exception.StackTrace != null) { vroot.Add( new XElement("StackTrace", from frame in exception.StackTrace.Split('\n') let prettierFrame = frame.Substring(6).Trim() select new XElement("Frame", prettierFrame)) ); } // Data is never null; it's empty if there is no data if (exception.Data.Count > 0) { root.Add( new XElement("Data", from entry in exception.Data.Cast<DictionaryEntry>() let key = entry.Key.ToString() let value = (entry.Value == null) ? "null" : entry.Value.ToString() select new XElement(key, value)) ); } // Add the InnerException if it exists if (exception.InnerException != null) { root.Add(new ExceptionXElement(exception.InnerException, omitStackTrace)); } return root; })()) { ; } } 

इस तरह protected निर्माता बनाएं (आपको अपना Exception वर्ग [Serializable] को भी चिह्नित करना चाहिए):

 protected MyException(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context):base(info,context) { } 

मुझे यकीन नहीं है कि आप अपवाद को क्यों क्रमबद्ध करना चाहते हैं …

यदि मैं आपके द्वारा निर्दिष्ट करना चाहता हूं, तो मैं एक कस्टम अपवाद क्लास बनाऊँगा जो ISerializable को लागू करता है आप इसे अपवाद के बच्चे बनाने के लिए चुन सकते हैं या आप इसे एक पूरी तरह से कस्टम वर्ग बना सकते हैं, जो आपके पास केवल वही है जो आपको चाहिए।

यह एक पुराना धागा है, लेकिन एक और जवाब के योग्य है।

@ एमएसन आश्चर्यचकित था कि कोई भी अपवाद को क्रमबद्ध करने के लिए क्यों चाहता है। ऐसा करने का हमारा कारण यहां है:

हमारे पास एक प्रिज़्म / एमवीवीएम अनुप्रयोग है, जिसमें सीआरएलएलइट और डब्ल्यूपीएफ दोनों के दृश्य हैं, डब्लूसीएफ सेवाओं में डेटा मॉडल के साथ। हम यह सुनिश्चित करना चाहते हैं कि डेटा पहुंच और अपडेट बिना त्रुटि के होते हैं यदि कोई त्रुटि है, तो हम तुरंत इसके बारे में जानना चाहते हैं, और उपयोगकर्ता को पता है कि कुछ असफल हो सकता है। हमारे अनुप्रयोग एक उपयोगकर्ता को एक संभव त्रुटि के बारे में सूचित करते हुए विंडो पॉप करेंगे। वास्तविक अपवाद तब हमें ई-मेल भेजता है, और ट्रैकिंग के लिए स्पाइसवर्क्स में संग्रहीत होता है। यदि WCF सेवा पर त्रुटि आती है, तो हम ग्राहक को पूर्ण अपवाद वापस प्राप्त करना चाहते हैं, इसलिए यह प्रक्रिया हो सकती है।

मैं जिस समाधान के साथ आया था वह यहां है WPF और सिल्वरलाइट क्लाइंट दोनों द्वारा नियंत्रित किया जा सकता है। प्रत्येक परत में कई अनुप्रयोगों द्वारा उपयोग की जाने वाली विधियों की "सामान्य" कक्षा पुस्तकालय में नीचे दिए गए तरीकों

एक बाइट सरणी आसानी से एक WCF सेवा से क्रमबद्ध है। बहुत ज्यादा किसी ऑब्जेक्ट को एक बाइट सरणी में कनवर्ट किया जा सकता है।

मैंने दो साधारण विधियों, ऑब्जेक्टबॉइट्स और बाइट्स 2 ऑब्जेक्ट से शुरुआत की। ये किसी ऑब्जेक्ट को एक बाइट सरणी और पीठ में परिवर्तित करते हैं। NetDataContractSerializer System.Runtime.Serialization नामस्थान के विंडोज संस्करण से है।

 Public Function Object2Bytes(ByVal value As Object) As Byte() Dim bytes As Byte() Using ms As New MemoryStream Dim ndcs As New NetDataContractSerializer() ndcs.Serialize(ms, value) bytes = ms.ToArray End Using Return bytes End Function Public Function Bytes2Object(ByVal bytes As Byte()) As Object Using ms As New MemoryStream(bytes) Dim ndcs As New NetDataContractSerializer Return ndcs.Deserialize(ms) End Using End Function 

मूल रूप से, हम एक परिणाम के रूप में सभी परिणाम वापस करेंगे। यदि वस्तु सेवा से वापस आ रही एक बाइट सरणी थी, तो हमें पता था कि यह एक अपवाद था। तब हम "बाइट्स 2 ऑब्जेक्ट" को कॉल करेंगे और हैंडलिंग के लिए अपवाद फेंक देंगे।

इस कोड के साथ परेशानी है, यह सिल्वरलाइट के साथ असंगत है इसलिए हमारे नए अनुप्रयोगों के लिए मैंने हार्ड-टू-सीरियललाइज ऑब्जेक्ट के लिए पुराने तरीकों को रखा और अपवादों के लिए नए तरीके की एक जोड़ी बनाई। DataContractSerializer सिस्टम से भी होता है। Runtime.Serialization नामस्थान, लेकिन यह दोनों Windows और Silverlight संस्करणों में मौजूद है

 Public Function ExceptionToByteArray(obj As Object) As Byte() If obj Is Nothing Then Return Nothing Using ms As New MemoryStream Dim dcs As New DataContractSerializer(GetType(Exception)) dcs.WriteObject(ms, obj) Return ms.ToArray End Using End Function Public Function ByteArrayToException(bytes As Byte()) As Exception If bytes Is Nothing OrElse bytes.Length = 0 Then Return Nothing End If Using ms As New MemoryStream Dim dcs As New DataContractSerializer(GetType(Exception)) ms.Write(bytes, 0, bytes.Length) Return CType(dcs.ReadObject(ms), Exception) End Using End Function 

जब कोई त्रुटि नहीं होती, तो WCF सेवा 1 लौटती है। यदि कोई त्रुटि आती है, तो वह अपवाद को ऐसे किसी पद्धति से गुज़रता है जो "ExceptionToByteArray" कहता है, फिर वर्तमान समय से एक अद्वितीय पूर्णांक उत्पन्न करता है। यह 60 सेकंड के लिए बाइट सरणी को कैश करने के लिए एक कुंजी के रूप में पूर्णांक का उपयोग करता है। WCF सेवा तब ग्राहक को महत्वपूर्ण मान देता है

जब ग्राहक यह देखता है कि 1 के अलावा किसी अन्य पूर्णांक को वापस मिल गया है, तो वह उस कुंजी मान का उपयोग करके सेवा की "गेटएक्सेप्शन" पद्धति को कॉल करता है। सेवा कैश से बाइट सरणी को प्राप्त करती है और उसे ग्राहक को वापस भेजती है। क्लाइंट "ByteArrayToException" को कॉल करता है और अपवाद को प्रक्रिया करता है जैसा मैंने ऊपर वर्णित किया है सेवा से अपवाद का अनुरोध करने के लिए ग्राहक के लिए 60 सेकंड बहुत समय है एक मिनट से भी कम समय में, सर्वर की मेमरीकैच को साफ़ कर दिया जाता है।

मुझे लगता है कि कस्टम अपवाद वर्ग बनाने से यह आसान है। मुझे उम्मीद है कि यह किसी के लिए बाद में सहायता है।