2013-11-14 14 views
20

इसलिए मैं अपने कोड बेस से गुजर रहा हूं और मैंने देखा है कि हमारे डीटीओ के पास [DataMember] और [IgnoreDataMember] विशेषताओं का मिश्रण और मिलान है।[IgnoreDataMember] विशेषता बनाम [डेटागम्बर] विशेषता नहीं है

अतीत में, हमें बताया गया है कि अगर हम डीटीओ धारावाहिक में कुछ नहीं चाहते हैं, तो बस [DataMember] विशेषता जोड़ें। तब मैंने दूसरी विशेषता देखी और कुछ खुदाई की और ऐसा लगता है कि यह स्पष्ट रूप से बताता है कि संपत्ति को क्रमबद्ध नहीं किया जाएगा।

अब मेरा प्रश्न है, जो बेहतर है? [IgnoreDataMember] जोड़ना या कुछ भी नहीं जोड़ना।

मैंने चारों ओर पूछा है और ऐसा लगता है कि [IgnoreDataMember] उन दिनों से है जब सबकुछ क्रमबद्ध किया गया था और आपको यह निर्देश देना था कि क्या अनदेखा किया जाना चाहिए (मुझे नेट 2 में विश्वास है)। फिर उन्होंने इसे विपरीत में बदल दिया और आपको स्पष्ट रूप से यह कहना था कि धारावाहिक होना चाहिए। अब ऐसा लगता है कि आप दोनों कर सकते हैं।

उत्तर

37

मैंने चारों ओर पूछा है और ऐसा लगता है कि [IgnoreDataMember] उन दिनों से है जब सबकुछ क्रमबद्ध किया गया था और आपको यह निर्देश देना था कि क्या अनदेखा किया जाना चाहिए (मुझे नेट 2 में विश्वास है)। फिर उन्होंने इसे विपरीत में बदल दिया और आपको स्पष्ट रूप से यह कहना था कि धारावाहिक होना चाहिए।

असल में यह सच नहीं है; यह IIRC हमेशा दोनों कर दिया गया है:

  • अगर यह [DataContract] के रूप में चिह्नित है, तो केवल सदस्यों चिह्नित [DataMember]
  • यह सब कुछ करने के लिए चूक माना जाता है अगर यह नहीं[DataContract] के रूप में चिह्नित है, तो है, लेकिन आप कर सकते हैं घटाना सदस्यों [IgnoreDataMember]

का उपयोग कर मैं आमतौर पर बस छोड़ चीजें हैं जो मैं धारावाहिक नहीं करना चाहती की [DataMember], लेकिन कई मायनोंमेंअधिक स्पष्ट है - मुख्य रूप से रखरखाव के लाभ के लिए। यह कहता है, "मैं जानबूझकर यह क्रमबद्ध नहीं कर रहा हूं", "शायद मुझे पता है कि यह क्रमबद्ध नहीं किया जा रहा है, लेकिन शायद मैं विशेषता जोड़ने के लिए भूल गया"।

या तो काम करेगा।

+3

भी एमएस के मुताबिक: "IgnoreDataMemberAttribute विशेषता केवल अनमार्क किए गए प्रकारों के साथ उपयोग की जाती है।"; यदि आप उसी वर्ग पर '[DataContract] 'और' [IgnoreDataMember] 'का उपयोग करते हैं, तो बाद वाले को अनदेखा किया जाता है। –

+2

@ माइकलएडेनफील्ड पेडेंटिक होने के लिए, 'डेटाकंट्रैक्टसेरियलाइज़र' सभी सार्वजनिक क्षेत्रों और गुणों * के लिए डिफ़ॉल्ट * (सार्वजनिक क्षेत्र बहुत दुर्लभ हैं); और यहां तक ​​कि यह थोड़ा अस्पष्ट है। उदाहरण के लिए, यदि हम 'NetDataContractSerializer' के बारे में बात कर रहे हैं, तो यह * सभी फ़ील्ड * (सार्वजनिक और निजी) पर डिफ़ॉल्ट है, लेकिन कोई गुण –

+1

मुझे पता है कि यह पुराना धागा है, लेकिन मुझे कल एक समस्या का सामना करना पड़ा जो इंगित करता है कि श्री ईडनफील्ड कहा बिल्कुल ठीक नहीं है। मेरे पास एक फ़ील्ड है, और 4 गुण हैं। सभी 4 गुण डेटा के कुछ रूप (बाइट सरणी, स्ट्रिंग या अन्य, उदाहरण के लिए) रूपांतरित करते हैं और इसे एक फ़ील्ड में लिखते हैं। मैंने क्लास को डेटाकंट्रैक्ट विशेषता के साथ चिह्नित किया और केवल डेटामेम्बर के रूप में फ़ील्ड को चिह्नित किया। हालांकि, इस तरह deserializer गुणों को अनदेखा नहीं किया है, लेकिन उन्हें डिफ़ॉल्ट मान (जो फ़ील्ड को ओवरराइट करेगा) पर सेट करें। गुणों के लिए [IgnoreDataMember] को जोड़ना समस्या को हल करता है। तो इसे नजरअंदाज नहीं किया जाता है –

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