.net - Events not working with after Deserialization -


समस्या:

मेरे पास एक बाल वर्ग जो डेटा कंट्रेक्ट सेरिअलाइज़ेशन का उपयोग करता है और जब इसका नाम गुण सेट किया जाता है तब कोई परिवर्तित ईवेंट बढ़ाता है।

  & lt; DataContract () & gt; पब्लिक क्लास चाइल्ड पब्लिक इवेंट चेंज () & lt; DataMember () & gt; स्ट्रिंग पब्लिक सब न्यू के रूप में स्ट्रिंग पब्लिक सब न्यू (ByVal NewName के रूप में स्ट्रिंग) _Name = NewName End Sub Public Property Name () के रूप में स्ट्रिंग लौटें _Name End सेट करें (ByVal मान स्ट्रिंग के रूप में) _Name = value RaiseEvent परिवर्तित () End Set End Property End Class  

यह एक अभिभावक वर्ग के भीतर समाहित है जो डेटा कंट्रेक्ट सेरियलाइजेशन का उपयोग करता है और बच्चे की बदली हुई घटना को संभालता है।

  & lt; DataContract () & gt; लोक कक्षा अभिभावक & lt; डेटामेम्बर () & gt; निजी उपशिक्षित बच्चे बाल निजी उप बाल-संगठित () हैंडल बाल हैंडल। बदले गए 'हैंडल बदले गए इवेंट यहाँ ... एंड सब एंड क्लास  

अभिभावक वर्ग सीरियल किया गया है और deserialized और सभी डेटा

हालांकि, deserialization के बाद, परिवर्तित घटना कभी नहीं उठाया जाता है!

प्रश्न

मुझे पता है कि deserialization प्रक्रिया वर्ग के निर्माणकर्ताओं को बायपास करता है, लेकिन क्या इस घटना को आरंभ नहीं किया जाना चाहिए?

क्या मैं कुछ गलत कर रहा हूं?

क्या घटनाक्रम को सीरियलाइज / डिसेरीलाइज करना संभव है?

क्या निम्नलिखित से नीचे कोई बेहतर उपाय है (नीचे देखें)?

क्या इस घटना को आरंभ करने का कोई तरीका है माता-पिता के बजाय बाल की ऑनडेसेराइज्ड पद्धति (नीचे देखें)?

कारकाउन्ड:

(1) बाल वर्ग के लिए निर्माता जो एक तर्क के रूप में खुद का एक उदाहरण लेता है।

(2) एक OnDeser जोड़ें मूल वर्ग के लिए आईसीआईडी ​​पद्धति जो बाल वर्ग के deserialzed उदाहरण के आधार पर बाल वर्ग की एक नई घटना बनाता है।

  & lt; OnDeserialized () & gt; निजी उप-डायरेसिअलाइज्ड पद्धति (स्ट्रीमिंगकॉन्टेक्स्ट के रूप में बाय संदर्भ) बाल = नया बच्चा (बाल) समाप्ति उप  

अब अपेक्षित के रूप में परिवर्तित ईवेंट उठाया गया है।

< Div class = "post-text" itemprop = "text">

समस्या यह नहीं है कि बदले गए घटना को निकाल नहीं दिया जा रहा है; जब तक समान श्रेणी की परिभाषा (घटना को स्थापित करने वाला सेटर के साथ) deserialized ऑब्जेक्ट के लिए उपयोग किया जाता है (डेटा कंट्रैक्टक्रिक क्रमांकन के साथ जो अपेक्षित नहीं है), तब ईवेंट को बढ़ाया जाएगा। क्या हो रहा है यह है कि deserialized ऑब्जेक्ट अब हैंडलर संलग्न नहीं है।

आप धारावाहिक या घटना हैंडलर deserialize नहीं कर सकते हैं; बहुत कम से कम, आपको नहीं करना चाहिए क्योंकि वे वर्तमान वस्तु संदर्भ के अलावा अन्य संदर्भों को इंगित कर सकते हैं, और क्योंकि deserialized ऑब्जेक्ट शायद अलग रनटाइम में एक नया संदर्भ है, धारावाहिक ऑब्जेक्ट से ईवेंट हैंडलर संदर्भ deserialization पर बेकार हैं, क्योंकि संदर्भ अब तक इंगित नहीं होगा नए रनटाइम के ढेर में अपेक्षित ऑब्जेक्ट।

समाधान आपके समाधान से थोड़ा आसान है, लेकिन एक ही विचार के आधार पर; माता-पिता में कस्टम deserialization व्यवहार को कार्यान्वित करें जो बच्चे की घटना के लिए हैंडलर को पुनः प्राप्त करता है:

  & lt; OnDeserialized () & gt; निजी उप-डायरेसिअलाइज्ड पद्धति (स्ट्रीमिंगकॉन्टेक्स्ट के रूप में बाय संदर्भ) AddHandler Child.Changed AddressOf Me.Child_Changed End Sub  

यह केवल एक और को नष्ट करने के लिए एक नए बच्चे को तत्काल बनाने की स्मृति और समय लागत से बचा जाता है, और वही चाल करो यह बाल पर ऐसा करने के लिए तकनीकी रूप से संभव है, लेकिन बच्चे को एक बैक्रेफरेंस का उपयोग करके उसके माता-पिता के ज्ञान की आवश्यकता होगी। यह थोड़ा पीछे है; आम तौर पर बोलते हुए, घटना raisers घटना हड़ताल "हड़पने" नहीं करते हैं, लेकिन इसके बजाय उन अन्य ऑब्जेक्ट्स द्वारा दिए गए हैं जो हैंडलर और ईवेंट के बारे में जानते हैं या जानते हैं।


Comments