2010-02-22 10 views
11

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

Stream file = File.Open("f", FileMode.Open); 
BinaryFormatter bf = new BinaryFormatter(); 

object obj = null; 
try 
{ 
    obj = bf.Deserialize(file); 
} 
catch (System.Runtime.Serialization.SerializationException e) 
{ 
    MessageBox.Show("De-Serialization failed : {0}", e.Message); 
} 
file.Close(); 

System.Collections.ArrayList nodeList = obj as System.Collections.ArrayList; 

foreach (TreeNode node in nodeList) 
{ 
    treeView.Nodes.Add(node); 
} 

निम्नलिखित वर्ग पर काम करने में विफल:

[Serializable()] 
class Simple 
{ 
    private int myInt; 
    private string myString; 
    public event SomeOtherEventDefinedElsewhere TheEvent; 

}

+0

क्या आप जो कुछ करने की कोशिश कर रहे हैं उसके बारे में कुछ और बता सकते हैं और संभवतः हमें थोड़ा कोड स्निपेट दे सकते हैं? – IAbstract

+0

निश्चित रूप से। मेरे पास बस इस वर्ग है जिसमें ज्यादातर स्ट्रिंग और int गुण हैं। लेकिन उपभोक्ताओं को सूचित करने के लिए कुछ घटनाएं हैं जब इसके उदाहरण बदलते हैं। मैं इस वर्ग के उदाहरणों को एक .NET TreeView क्लास की टैग प्रॉपर्टी में संग्रहीत कर रहा हूं, या अधिक विशेष रूप से, प्रत्येक TreeNode की प्रत्येक टैग प्रॉपर्टी में ऑब्जेक्ट से मेल खाता है।जब मैं ट्री व्यू को डिस्क पर क्रमबद्ध करने की कोशिश करता हूं (प्रत्येक नोड को एक ऐरेलिस्ट में संग्रहीत करता है और फिर सूची लिखता है), मुझे एक अपवाद मिलता है: "'MyEventSubscriber' टाइप करें 'असेंबली' MyAssembly, संस्करण = 1.0.0.0, संस्कृति = तटस्थ, PublicKeyToken = शून्य 'धारावाहिक के रूप में चिह्नित नहीं है। " – Rhubarb

+0

cont ... MyEventSubscriber उस क्लास के ईवेंट के लिए ग्राहक का क्लास उदाहरण होता है जिसे मैं धारावाहिक करने की कोशिश कर रहा हूं (वह जो ट्री नोड की टैग प्रॉपर्टी में है)। – Rhubarb

उत्तर

19

"घटनाओं के मामले में, आप भी क्षेत्र विशेषता क्वालीफायर जब NonSerialized लागू करने को जोड़ना होगा विशेषता ताकि विशेषता परके बजाय अंतर्निहित प्रतिनिधि पर लागू होघटना अपने आप में " Advanced Serialization - MSDN


उपसर्ग क्षेत्र के साथ NonSerializedAttribute

[field:NonSerialized] 
public event MyEventHandler MyEvent; 
+0

मैंने कोशिश की कि हालांकि यह कुछ भी नहीं बदला है। मुझे अभी भी अपवाद मिलता है। यह बहुत विचित्र होगा कि फॉर्मेटर को इस क्रमबद्ध करने की कोशिश करने से रोकने का कोई तरीका नहीं है। कोई अन्य सुझाव? – Rhubarb

+0

यह मेरे लिए काम किया। धन्यवाद! '[फ़ील्ड: विशेषता] 'वाक्यविन्यास के बारे में नहीं पता था। मुझे कुछ टाइपिंग बचाया। – Max

0

यह याद रखना महत्वपूर्ण है कि विशेषता [Field:NonSerialized] प्रतिनिधियों, नहीं घटनाओं के लिए लागू किया जाता है, केस संवेदी महत्वपूर्ण है वैसे, फिर एक ISerializable ऑब्जेक्ट को कार्यान्वित करें, और प्रतिबिंब का उपयोग करके, उस वर्ग के माध्यम से पुनरावृत्ति करें जिसे आप क्रमबद्ध कर रहे हैं, इवेंट हैंडलर की तलाश कर रहे हैं, और क्रमबद्ध करने से पहले ईवेंट को अनसब्सक्राइब करें। फिर deserializing जब आप deserializing पर स्वचालित रूप से आवश्यक घटनाओं को तार कर सकते हैं ...

+2

क्या आप निश्चित हैं? ऐसा लगता है कि फ़ील्ड कम केस 'एफ' होना चाहिए। यदि मुझे घटनाओं को छोड़ना और सदस्यता समाप्त करना है तो गैर धारावाहिक होने का क्या मतलब है? – Rhubarb

+0

@ rhubarb @ आप प्रतिनिधियों की सूची या घटनाओं के श्रोताओं की सूची के माध्यम से फिर से प्रतिनिधि को मुक्त कर रहे हैं, यदि आप नहीं करते हैं कि 'धारावाहिक उनके माध्यम से भर्ती करेगा ... – t0mm13b

+2

अच्छी तरह से श्रोताओं को मुक्त करने की आवश्यकता क्यों है यदि घटना है गैर serializable के रूप में चिह्नित? क्या यह एक विरोधाभास नहीं है? – Rhubarb

0

मुझे पता है कि यह एक देर से पोस्ट है लेकिन यहां इस सवाल का वास्तविक जवाब है। मैन्युअल बनाएं/अपने ईवेंट के लिए "गेटर्स/सेटर्स" हटाएं (संकलक दृश्यों के पीछे आपके लिए यह करता है लेकिन इस मामले में आपको स्पष्ट रूप से ऐसा करना होगा) फिर अपने ईवेंट को गैर-क्रमबद्ध के रूप में चिह्नित करें। मैं के लिए कोड को तोड़ने के लिए समय की जरूरत नहीं है तुम लेकिन एक त्वरित खोज कोई है जो एक ही मुद्दा में भाग का पता चलता है:

http://sanity-free.org/113/csharp_binary_serialization_oddities.html

लेकिन इस लाइन का उपयोग न करें: [MethodImpl (MethodImplOptions.Synchronized)]

इससे थ्रेड-सुरक्षा समस्याएं होती हैं जो सी # 4 में तय की गई थीं; देखें:

http://blogs.msdn.com/b/cburrows/archive/2010/03/05/events-get-a-little-overhaul-in-c-4-part-i-locks.aspx

आप या तो अपने स्वयं के लॉकसेल विकल्प (कैस का प्रयोग करके) रोल या एक के लिए ऑनलाइन खोज करने के लिए की आवश्यकता होगी; दुर्भाग्य से मेरे पास समय नहीं है क्योंकि मुझे दौड़ना है लेकिन आपको विचार मिलता है।

आशा है कि इससे मदद मिलती है!

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

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