DataContract और DataMember विशेषताओं का उपयोग कब करें?


179

मैं DataContractWCF में विशेषता के बारे में बहुत उलझन में हूँ । मेरे ज्ञान के अनुसार, इसका उपयोग वर्गों के समान उपयोगकर्ता परिभाषित प्रकार को क्रमबद्ध करने के लिए किया जाता है। मैंने एक वर्ग लिखा है जो इस तरह से ग्राहक की ओर से उजागर किया गया है।

[DataContract]
public class Contact
{
    [DataMember]
    public int Roll { get; set; }

    [DataMember]
    public string Name { get; set; }

    [DataMember]
    public string Address { get; set; }

    [DataMember]
    public int Age { get; set; }
}

यह ठीक से काम कर रहा है लेकिन जब मैं हटाता हूं DataContractऔर DataMemberयह भी ठीक से काम करता है। मैं समझ नहीं पा रहा हूं कि यह ठीक से क्यों काम कर रहा है। क्या कोई मुझे बता सकता है कि इसका वास्तविक उपयोग क्या है DataContract?

मेरा सेवा अनुबंध इस तरह दिखता है

[ServiceContract]    
public interface IRestServiceImpl
{
    [OperationContract]        
    Contact XmlData(string id);      
}

एक सटीक जवाब यहाँ है stackoverflow.com/questions/5681842/…
आसिफ इकबाल

जवाबों:


361

चूंकि बहुत सारे प्रोग्रामर .NET 3.5 SP1 के साथ [DataContract]और [DataMember]विशेषताओं से अभिभूत थे , इसलिए Microsoft ने डेटा कॉन्ट्रैक्ट सीरलाइज़र को सभी वर्गों को हैंडल किया - यहां तक ​​कि उन सभी एट्रिब्यूट्स के बिना भी - बहुत हद तक पुराने XML सीरियलाइज़र की तरह।

इसलिए .NET 3.5 SP1 के रूप में, आपको डेटा अनुबंध या डेटा सदस्य विशेषताओं को अब और जोड़ना नहीं है - यदि आप नहीं करते हैं, तो डेटा अनुबंध क्रमांकक आपकी सार्वजनिक सभी संपत्तियों को वैसा ही बना देगा, जैसे XML धारावाहिक में होता है।

कैसे: उन विशेषताओं को न जोड़कर, आप बहुत सारी उपयोगी क्षमताओं को खो देते हैं:

  • इसके बिना [DataContract], आप अपने डेटा के लिए XML नेमस्पेस को परिभाषित नहीं कर सकते
  • बिना [DataMember], आप गैर-सार्वजनिक संपत्तियों या क्षेत्रों को क्रमबद्ध नहीं कर सकते
  • इसके बिना [DataMember], आप क्रमबद्धता ( Order=) के आदेश को परिभाषित नहीं कर सकते हैं और DCS वर्णानुक्रम में सभी गुणों को क्रमबद्ध करेगा
  • बिना [DataMember], आप अपनी संपत्ति के लिए एक अलग नाम परिभाषित नहीं कर सकते ( Name=)
  • इसके बिना [DataMember], आप चीजों को IsRequired=या अन्य उपयोगी विशेषताओं को परिभाषित नहीं कर सकते
  • बिना [DataMember], आप कुछ सार्वजनिक संपत्तियों को नहीं छोड़ सकते - सभी सार्वजनिक संपत्तियों को डीसीएस द्वारा क्रमबद्ध किया जाएगा

तो एक "quick'n'dirty" समाधान के लिए, दूर जाना [DataContract]और [DataMember]विशेषताएँ काम करेंगी - लेकिन यह अभी भी आपके डेटा वर्गों पर उनके लिए एक अच्छा विचार है - बस जो आप कर रहे हैं उसके बारे में और अधिक स्पष्ट होने के लिए, और अपने आप को देने के लिए। उन सभी अतिरिक्त सुविधाओं तक पहुँच जो आपको उनके बिना नहीं मिलती हैं ...


आप डिफ़ॉल्ट रूप से सभी डेटा प्रकारों को आंतरिक रूप से अनुक्रमिक के रूप में चिह्नित करते हैं और हमने उन्हें प्रतिबंधित करने के लिए DataContract / DataMember का उपयोग किया है।
संतोष सिंह

2
@ संतोष: यदि आपके पास कुछ सार्वजनिक संपत्तियों के साथ एक वर्ग है, तो उन्हें डब्ल्यूसीएफ डेटा कॉन्ट्रैक्ट सीरियलाइज़र द्वारा अनुक्रमित किया जाएगा, जब तक कि आप स्पष्ट रूप से [डेटाकंट्रेक्ट] / [डेटामेम्बर] को लागू नहीं करते हैं। - तब यह आपके लिए 100% है कि यह कहना है कि क्रमबद्ध और क्या मिलता है। क्या नहीं
marc_s

36
@ अर्थ: यह पूरी तरह सच नहीं है। नेट 3.5 एसपी 1 के रूप में, WCF होगा खुशी से बिना serialize कक्षाएं किसी भी [DataContract] और [DataMember]विशेषताओं ... लेकिन जैसे ही आप उन विशेषताओं में से एक का उपयोग कर, तो यह "डिफ़ॉल्ट" व्यवहार काम करना बंद होगा शुरू के रूप में - के रूप में आप एक है ही एकल [DataMember] में अपने वर्ग, उस बिंदु से, इस विशेषता वाले केवल गुण ही क्रमबद्ध होंगे।
marc_s

4
Oohh! उस बिंदु को स्पष्ट करने के लिए Thx! मैं इसे थोड़ा आगे खोदूंगा!
आर्थिस

6
Youhou! यह जबरदस्त है!! बहुत बहुत धन्यवाद!
आर्थिस

16

WCF के संदर्भ में, हम संदेश के माध्यम से सर्वर और क्लाइंट के साथ संवाद कर सकते हैं। संदेशों को स्थानांतरित करने के लिए, और एक सुरक्षा संभावना से, हमें क्रमबद्ध प्रारूप में एक डेटा / संदेश बनाने की आवश्यकता है।

क्रमबद्ध डेटा के लिए हम [datacontract] और [datamember] विशेषताओं का उपयोग करते हैं। आपके मामले में यदि आप datacontractWCF का उपयोग कर रहे हैं तो WCF उपयोग DataContractSerializerकरता है XmlSerializerजो कि डिफ़ॉल्ट क्रमांकन तकनीक है।

मुझे विस्तार से समझाएं:

मूल रूप से WCF 3 प्रकार के क्रमांकन का समर्थन करता है:

  1. XmlSerializer
  2. DataContractSerializer
  3. NetDataContractSerializer

XmlSerializer : - डिफ़ॉल्ट क्रम वर्ग के समान है

DataContractSerializer / NetDataContractSerializer : - डिफ़ॉल्ट क्रम वर्णमाला है

XmlSerializer : - XML ​​स्कीमा व्यापक है

DataContractSerializer / NetDataContractSerializer : - XML ​​स्कीमा विवश है

XmlSerializer : - वर्जनिंग सपोर्ट संभव नहीं

DataContractSerializer / NetDataContractSerializer : - संस्करण समर्थन संभव है

XmlSerializer : - ASMX के साथ संगतता

DataContractSerializer / NetDataContractSerializer : - .NET रीमोटिंग के साथ संगतता

XmlSerializer : - XmlSerializer में आवश्यक नहीं विशेषता

DataContractSerializer / NetDataContractSerializer : - इस क्रमांकन में आवश्यक गुण

इसलिए आप जो उपयोग करते हैं वह आपकी आवश्यकताओं पर निर्भर करता है ...


8

डेटा अनुबंध एक सेवा और क्लाइंट के बीच एक औपचारिक समझौता है जो डेटा के आदान-प्रदान का सार बताता है। यही है, संवाद करने के लिए, ग्राहक और सेवा को एक ही प्रकार, केवल एक ही डेटा अनुबंध साझा करने की आवश्यकता नहीं है। एक डेटा कॉन्ट्रैक्ट सटीक रूप से परिभाषित करता है, प्रत्येक पैरामीटर या रिटर्न प्रकार के लिए, किस डेटा को क्रमबद्ध (एक्सएमएल में बदल) का आदान-प्रदान किया जाना है।

विंडोज कम्युनिकेशन फ़ाउंडेशन (WCF) क्रमबद्धता इंजन का उपयोग करता है जिसे डेटा अनुबंध सीरियलाइज़र कहा जाता है, डिफ़ॉल्ट रूप से डेटा को क्रमबद्ध और डिसेरियलाइज़ करने के लिए (इसे XML से और इसमें कनवर्ट करें)। सभी .NET फ्रेमवर्क आदिम प्रकार, जैसे कि पूर्णांक और स्ट्रिंग्स, साथ ही कुछ प्रकार जिन्हें प्राइमेटिव के रूप में माना जाता है, जैसे कि डेटाइम और एक्सएमएलईमेंट, बिना किसी अन्य तैयारी के साथ क्रमबद्ध किया जा सकता है और इन्हें डिफ़ॉल्ट डेटा अनुबंध माना जाता है। कई .NET फ्रेमवर्क प्रकारों में भी मौजूदा डेटा अनुबंध होते हैं।

आप यहां पूरा लेख पा सकते हैं


2
यह सब सच है और ठीक है, लेकिन यह वास्तव में ओपी के सवाल का जवाब नहीं देता है कि डेटा कॉन्ट्रैक्ट सीरियलाइज़र भी बिना किसी [DataContract] और [DataMember] के अपनी कक्षाओं में काम क्यों करता है ....
marc_s

क्या कोई मुझे बता सकता है कि DataContract का वास्तविक उपयोग क्या है? - मुझे लगता है कि सवाल का कम से कम हिस्सा जवाब दिया है।
आईब्रेट

2

डेटा अनुबंध एक सेवा और क्लाइंट के बीच एक औपचारिक समझौता है जो डेटा के आदान-प्रदान का सार बताता है।

डेटा अनुबंध स्पष्ट या निहित हो सकता है। सरल प्रकार जैसे इंट, स्ट्रिंग आदि में एक अंतर्निहित डेटा अनुबंध होता है। उपयोगकर्ता परिभाषित ऑब्जेक्ट स्पष्ट या जटिल प्रकार है, जिसके लिए आपको [DataContract] और [DataMember] विशेषता का उपयोग करके डेटा अनुबंध को परिभाषित करना होगा।

डेटा अनुबंध को इस प्रकार परिभाषित किया जा सकता है:

  • यह सेवा संचालन के लिए और पास किए गए डेटा के बाहरी प्रारूप का वर्णन करता है

  • यह सेवा संदेशों में एक्सचेंज की गई संरचना और प्रकार के डेटा को परिभाषित करता है

  • यह एक XML स्कीमा के लिए CLR प्रकार को मैप करता है
  • यह परिभाषित करता है कि कैसे डेटा प्रकार क्रमबद्ध और deserialized हैं। क्रमांकन के माध्यम से, आप किसी ऑब्जेक्ट को बाइट्स के अनुक्रम में परिवर्तित करते हैं जिसे नेटवर्क पर प्रसारित किया जा सकता है। डिसेरिएलाइज़ेशन के माध्यम से, आप बाइट्स के एक क्रम से एक वस्तु को पुनः प्राप्त करते हैं जो आपको कॉलिंग एप्लिकेशन से प्राप्त होता है।
  • यह एक संस्करण प्रणाली है जो आपको संरचित डेटा में परिवर्तन का प्रबंधन करने की अनुमति देती है

हमें प्रोजेक्ट में System.Runtime.Serialization संदर्भ शामिल करने की आवश्यकता है। यह असेंबली DataContract और DataMember विशेषता रखती है।


2
  1. डेटा अनुबंध: यह निर्दिष्ट करता है कि आपका इकाई वर्ग सीरियलाइज़ेशन प्रक्रिया के लिए तैयार है।

  2. डेटा सदस्य: यह निर्दिष्ट करता है कि विशेष क्षेत्र डेटा अनुबंध का हिस्सा है और इसे क्रमबद्ध किया जा सकता है।


0

जब आप http अनुरोध से कॉल करते हैं तो यह ठीक से काम करेगा लेकिन जब नेट से कॉल करने का प्रयास किया जाता है। उस समय आपको यह सब सामान मिलता है


0

DataMember विशेषता को क्रमबद्ध डेटा जोड़ने के लिए अनिवार्य नहीं है। जब DataMember विशेषता नहीं जोड़ी जाती है, तो पुराने XMLSerializer डेटा को क्रमबद्ध करता है। DataMember जोड़ने से ऑर्डर, नाम, isrequired जैसे उपयोगी गुण मिलते हैं जो अन्यथा उपयोग नहीं किए जा सकते।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.