2010-03-05 5 views
16

मुझे इवेंट क्लास सदस्य को क्रमबद्ध करने से बचने की आवश्यकता है क्योंकि जब ईवेंट किसी ऑब्जेक्ट द्वारा संभाला जाता है जिसे धारावाहिक के रूप में चिह्नित नहीं किया जाता है तो क्रमिकरण विफल हो जाएगा।बाइनरी क्रमबद्धता के लिए इवेंट क्लास सदस्य को अनदेखा कैसे करें?

मैंने इवेंट क्लास सदस्य पर NonSerialized विशेषता का उपयोग करने का प्रयास किया लेकिन यह संकलन करने में विफल रहता है। कोड की यह पंक्ति:

Attribute 'NonSerializedAttribute' cannot be applied to 'PropertyValueChanged' because the attribute is not valid on this declaration type.

Public Event PropertyValueChanged() ' compiles but needs the extra handling described below 

वहाँ एक और तरीका घटना सदस्यों serializing से बचने के लिए है:

<NonSerialized()> Public Event PropertyValueChanged() 

निम्नलिखित त्रुटि पैदा करता है?

यदि ईवेंट को संभाला नहीं जाता है तो यह कोई समस्या नहीं है और मैं उन्हें क्रमबद्ध करने से पहले ऑब्जेक्ट्स (और ईवेंट को अनदेखा करके) इसके आसपास काम कर सकता हूं। बस एक बेहतर तरीका है कि क्या सोच रहा है।

धन्यवाद।

+0

@ पॉल - फिर भी "विफल रहता है"; आप वास्तव में क्या करना चाहते हैं? मुझे आश्चर्य है कि क्या सीरिएलाइज़र बदलना एक अच्छा विकल्प होगा (यह उतना कठिन नहीं है जितना लगता है, और साइड फायदे भी हैं)। आप पर निर्भर है, लेकिन मैं इस क्षेत्र के बारे में * घंटे * के लिए बात कर सकता हूं ... –

+0

@Marc: अनुसरण करने के लिए धन्यवाद। सीरियलाइज़ेशन विफल होने पर कक्षा को क्रमबद्ध करते समय मुझे घटनाओं को अनदेखा करने की आवश्यकता होती है जब घटना किसी ऑब्जेक्ट पर वायर्ड होती है जो धारावाहिक नहीं है। NonSerialized विशेषता समझ में आता है लेकिन सी # में वीबी में उसी तरह काम नहीं कर रहा है ... जब मैं एक बैकिंग फ़ील्ड को सार्वजनिक ईवेंट प्रॉपर्टी में सजाने के लिए भी एक कंपाइलर त्रुटि प्राप्त करता हूं। जब आप "धारावाहिक को बदलना" कहते हैं तो आपका क्या मतलब है? क्या आपका मतलब कस्टम सीरियलाइजेशन या कुछ अन्य, तृतीय पक्ष लाइब्रेरी है? –

उत्तर

32

सी # में आप इसे नीचे कर सकते हैं, इसलिए आशा यह समान रूप से वीबी के लिए अनुवाद करता है।

नोट यह केवल क्षेत्ररक्षण की तरह करने के लिए घटनाओं लागू होता है (आप की जरूरत नहीं है यानी जहां अपनी खुद की add/remove):

[field: NonSerialized] 
public event EventType EventName; 

अन्यथा कुछ की तरह:

[NonSerialized] 
EventType backingField; 
public event EventType { 
    add { backingField += value; } 
    remove { backingField -= value; } 
} 
+0

+1 मुझे पता होना चाहिए था कि इस प्रश्न का उत्तर देने के लिए आपको मारने का कोई तरीका नहीं होगा। – kemiller2002

+0

ठीक है मैंने कुछ नया सीखा :) अच्छा समाधान। – NebuSoft

+0

दुर्भाग्यवश न तो विकल्प वीबी में अनुवाद करता है ... –

5

ऐसा नहीं है काम कर रहा है क्योंकि संकलक वास्तव में घटना के लिए एक बैकिंग फ़ील्ड उत्पन्न करता है। इसे सक्षम करने के लिए, बस क्षेत्र के साथ अपने विशेषता उपसर्ग:

[field: NonSerialized] 
public event EventHandler PropertyValueChanged; 
+0

यह किसी कारण से VB.NET के लिए काम नहीं करता है। –

0

मैं कैसे परियोजनाओं के लिए अतीत में किया है IXmlSerializable इंटरफ़ेस को लागू और मैन्युअल रूप से मेरी क्रमबद्धता नियंत्रित करते हैं। मुझे लगता है कि यह जीयूआई आधारित नियंत्रण (कई घटनाओं के साथ) serializing बनाता है बहुत आसान है।

IXmlSerializable

+0

'IXmlSerializable' बाइनरी क्रमिकरण पर लागू नहीं होता है।यह 'ISerializable' होगा, जो बहुत अलग है। –

+0

मुझे याद आया जहां उन्होंने बाइनरी के लिए इसे टैग किया था। मेरी गलती, किसी कारण से मुझे लगता है कि वह एक्सएमएल के लिए पूछ रहा था। – NebuSoft

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