2009-11-13 21 views
36

मैं एक ऑटो लागू संपत्ति को बाइनरी फॉर्मेटर द्वारा क्रमबद्ध करने से कैसे रोक सकता हूं? [NonSerialized] विशेषता केवल फ़ील्ड के साथ उपयोग की जा सकती है। और स्वत: कार्यान्वित गुणों का उपयोग करते समय क्षेत्र छिपा हुआ है।स्वत: कार्यान्वित गुणों को धारावाहिक होने से कैसे रोकें?

उत्तर

59

यह ऑटो कार्यान्वित गुणों के लिए समर्थित नहीं है। आपको बैकिंग फ़ील्ड का उपयोग करना होगा और उस पर NonSerializedAttribute सेट करना होगा।

public class ClassWithNonSerializedProperty { 

    [NonSerialized] 
    private object _data; // Backing field of Property Data that is not serialized 

    public object Data{ 
    get { return _data; } 
    set { _data = value; } 
    } 
} 
+0

या आप [field: NonSerialized] का उपयोग कर सकते संपत्ति पर सीधे। – profou

4

यदि आप एक्सएमएल को क्रमबद्ध कर रहे हैं तो आप XmlIgnore विशेषता का उपयोग कर सकते हैं।

4

मुझे यकीन नहीं है कि आप कर सकते हैं। यह MSDN article on SerializableAttribute आप ISerializable लागू करने और क्रमबद्धता खुद को नियंत्रित करने का सुझाव:

सभी एक प्रकार में सार्वजनिक और निजी क्षेत्रों कि SerializableAttribute द्वारा चिह्नित कर रहे हैं, डिफ़ॉल्ट रूप से क्रमानुसार लगे हुए हैं, जब तक कि प्रकार क्रमबद्धता प्रक्रिया ओवरराइड करने के लिए ISerializable इंटरफ़ेस को लागू करता है ।

या उस विशिष्ट फ़ील्ड के लिए एक ऑटो-प्रॉपर्टी से दूर स्विच करें।

8
// This works for the underlying delegate of the `event` add/remove mechanism. 
[field:NonSerialized] 
public event EventHandler SomethingHappened; 

लेकिन यह स्वत: लागू किया संपत्तियों के लिए प्रतीत नहीं होता है। मैंने सोचा कि यह उल्लेखनीय था क्योंकि यह जानने के लिए उपयोगी है कि ऑब्जेक्ट सब्सक्राइबर्स के साथ ऑब्जेक्ट को क्रमबद्ध करते समय।

4

ऑटो कार्यान्वित गुणों के लिए यह संभव नहीं है। फोल्डिंग पर विचार करें:

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

(http://social.msdn.microsoft.com/Forums/en-US/vcsharp2008prerelease/thread/2b6eb489-122a-4418-8759-10808252b195)

3

नहीं-धारावाहिक समर्थन क्षेत्र का उपयोग .NET 4.0 (कम से कम Xml क्रमबद्धता के मामले में) के साथ ठीक ढंग से काम नहीं लगता है की प्रस्तावित समाधान। क्षेत्र वास्तव में धारावाहिक नहीं मिलता है लेकिन सार्वजनिक संपत्ति जो इसका उपयोग करती है वह धारावाहिक करता है और इस प्रकार उद्देश्य को हरा देता है। XmlIgnore वर्कअराउंड का उपयोग एक्सएमएल क्रमबद्धता के मामले में मदद करता है। अस्वीकरण - मैंने बाइनरी क्रमबद्धता व्यवहार को सत्यापित नहीं किया।

6

यदि आप जेसन को क्रमबद्ध कर रहे हैं और Json.NET serializer का उपयोग कर रहे हैं (जो मैं अत्यधिक अनुशंसा करता हूं क्योंकि बाजार में कई अन्य धारावाहिकों की तुलना में इसकी पेशकश करने के लिए बहुत कुछ है) तो आप प्रॉपर्टी पर अपने वांछित परिणाम प्राप्त कर सकते हैं [JsonIgnore]

आपको फ़ील्ड बनाने की आवश्यकता नहीं है।

तो अपने कोड होगा:

public class ClassName 
{ 
    [JsonIgnore] 
    public object IgnoreMe { get; set; } 

    public object DoNotIgnoreMe { get; set; } 
} 
संबंधित मुद्दे