2010-02-25 12 views
30

मेरे पास नियमित सी # पॉको है। कक्षा के स्तर पर, मैं [Serializable()] के साथ ऑब्जेक्ट को सजाने वाला हूं।एक संपत्ति पर बाइनरी क्रमबद्धता को अनदेखा करें

उसने कहा, मैं गुणों में से एक पर लिंक Sum() का उपयोग कर रहा हूं और मुझे क्रमबद्धरण पर एक त्रुटि प्राप्त हो रही है। यदि संभव हो, तो मैं बस इस संपत्ति को अनदेखा करना चाहता हूं। हालांकि, [XmlIgnore()] केवल एक्सएमएल सीरियलाइजेशन के लिए है, बाइनरी नहीं। कोई विचार या विचार?

कोड कुछ इस तरह है, जहां मैं ValueTotal उपेक्षा करना चाहते हैं है:

[Serializable()] 
public class Foo 
{ 
    public IList<Number> Nums { get; set; } 

    public long ValueTotal 
    { 
    get { return Nums.Sum(x => x.value); } 
    } 
} 
+11

उत्तरों में दोहराए गए बिंदु पर ध्यान दें; बाइनरीफॉर्मेटर को पहले स्थान पर गुणों की परवाह नहीं है ... –

उत्तर

-11

Cheat और एक विधि

[Serializable()] 
public class Foo 
{ 
    public IList<Number> Nums { get; set; } 

    public long GetValueTotal() 
    { 
    return Nums.Sum(x => x.value); 
    } 
} 
+1

+1 जबकि मैं कभी-कभी संपत्ति के बराबर गुणों के साथ संघर्ष करता हूं, और कभी-कभी राज्य की गणना की जाती है, मैं और अधिक सहमत होना शुरू कर रहा हूं कि यदि आप गणना कर रहे हैं, तो आप एक विधि का उपयोग करना चाहिए क्योंकि यह इरादा दिखाता है कि यह मान गणना का परिणाम है। सच्चाई यह है कि, आप गणना किए गए मूल्य को क्रमबद्ध क्यों करेंगे, क्या आप इच्छित डेटा को क्रमबद्ध नहीं करना चाहिए, और फिर दूसरी तरफ गणना को फिर से करें? – NerdFury

+0

मैं नेरडफरी से सहमत हूं, यह मेरे इरादों को बेहतर तरीके से संवाद करता है। धन्यवाद। -जेसी Houle –

+0

यह "धारावाहिकता पर एक त्रुटि प्राप्त करने" समस्या को कैसे हल करता है? मुझे लगता है कि नंबर क्रमिक नहीं था, इस प्रकार नम्स संपत्ति के बैकिंग फील्ड को क्रमबद्ध करना विफल हो जाएगा। – Henrik

32

    [NonSerialized] 
    private IList<Number> nums; 
    public IList<Number> Nums { get {return nums;} set { nums = value; } } 
+1

फिर से पढ़ें। वह ValueTotal-Property को अनदेखा करना पसंद करता है, सूची – Scoregraphic

+12

नहीं, ValueTotal प्रॉपर्टी को अनदेखा करने की आवश्यकता नहीं है। बाइनरी सीरियलाइजेशन फ़ील्ड को क्रमबद्ध करता है, गुण नहीं – Henrik

56

ValueTotal पहले से ही नजरअंदाज कर दिया है का उपयोग करें। केवल डेटा क्रमबद्ध है, तरीकों से नहीं। गुण वास्तव में विधियां हैं।

यदि आप फ़ील्ड को अनदेखा करना चाहते हैं और उन्हें क्रमबद्ध नहीं करना चाहते हैं तो उन्हें [NonSerialized] के रूप में चिह्नित करें।

'या'

आप ISerializable लागू कर सकते हैं और उन क्षेत्र को क्रमानुसार नहीं। बाइनरी के रूप में http://www.c-sharpcorner.com/UploadFile/yougerthen/102162008172741PM/1.aspx

+0

यदि यह 'PropertyChangedEventHandler' जैसी घटना है, तो इसे _ [फ़ील्ड: NonSerialized] _ के साथ चिह्नित किया जाना चाहिए। मुझे लगता है कि यह उन लोगों के लिए उपयोगी होगा जो आपके खोज को खोज रहे थे, जो मैं खोज रहा था। – Casper

+0

आप क्या खोज रहे थे? ' – ata

+0

मैं बाइनरी क्रमबद्धता के दौरान एक घटना के क्रमबद्धीकरण को छोड़ना चाहता था, और मैंने खोला पहला पोस्ट यह था। मुझे वास्तव में _ [फ़ील्ड: NonSerialized] _ चिह्न की आवश्यकता थी, इसलिए मैंने सोचा कि यह टिप्पणी करने के लिए उपयोगी होगा। – Casper

0

ISerializable इंटरफ़ेस को लागू और फिर GetObjectData() विधि में XML serialzation के लिए उपयोग [XmlIgnore] लेकिन फिर उत्पादन:

यहाँ कैसे ISerializable को लागू करने और डेटा को क्रमानुसार कर सकते हैं पर कुछ नमूना कोड है। यह वास्तव में सरल है कि मैंने इसे कैसे वर्णित किया है।

विचारों के लिए, देखें http://www.c-sharpcorner.com/UploadFile/yougerthen/102162008172741PM/1.aspx

2

(कोड के नीचे बनाया गया था दोनों द्विआधारी क्रमांकन और xml समर्थन करने के लिए) एक और तरीका है कि यहाँ सूचीबद्ध नहीं है कुछ फायदे हैं कि नहीं है (उदाहरण के लिए अपने आप एक कस्टम वर्ग की आवश्यकता होगी अपने इंटरफेस को क्रमबद्ध करने के लिए):

[OnSerializing] 
    private void OnSerializing(StreamingContext context) 
    { 
     xmlShape4Port = new xmlStreamShape(shape4Port); 
     shape4Port = null; 
    } 
    [OnDeserialized] 
    private void OnDeserialized(StreamingContext context) 
    { 
     if (xmlShape4Port != null) 
     { 
      shape4Port = xmlShape4Port.getShapeFromSaved(); 
      xmlShape4Port = null; 
     } 
    } 

    [XmlIgnore()] 
    public virtual StreamShape shape4Port {get;set;} 

    [XmlElement("shape4Port")] 
    public xmlStreamShape xmlShape4Port 
    { 
     get 
     { 
      if (shape4Port == null) 
       return null; 
      else 
      { 
       return new xmlStreamShape(shape4Port); 
      } 
     } 
     set 
     { 
      shape4Port = value.getShapeFromSaved(); 
     } 
    } 
संबंधित मुद्दे