2011-04-21 8 views
6

मैं हाल ही में एक लेख में देखा WCF सेवा संचालन एक collectiondatacontractWCF CollectionDataContract

Users GetUsers(string someInput); 

और उपयोगकर्ता प्रकार नीचे के रूप में परिभाषित किया गया था लौटे:

[CollectionDataContract] 
    public class Users : List<User> 
    { 
     public Users() 
     { 
     } 

     public Users(IEnumerable<User> users) : base(users) 
     { 
     } 
    } 

तरह के उपयोगकर्ता collectiondatacontract लौटने करता है (यह मामला) List<User> लौटने की तुलना में एक अलग उद्देश्य प्रदान करता है?

+0

दिलचस्प .... – Seva

+1

धन्यवाद! मैंने इसका इस्तेमाल किया, लेकिन सहायता पृष्ठ पीढ़ी के काम को बनाने के लिए बेस कन्स्ट्रक्टर को कॉल करने की भी आवश्यकता है - इसलिए आपके उदाहरण में: 'सार्वजनिक उपयोगकर्ता() {}' के साथ 'सार्वजनिक उपयोगकर्ता(): आधार() {}'। –

+0

@IanGrainger कुछ और अस्वस्थ होना चाहिए - अन्यथा निर्दिष्ट नहीं होने पर नो-एर्ग बेस कन्स्ट्रक्टर स्वचालित रूप से कॉल किया जाता है .. – user2864740

उत्तर

4

जहां तक ​​मैं समझता हूं, यह विशेषता आपको अंतिम एक्सएमएल स्ट्रिंग में तत्वों के नामों के बारे में कुछ नियंत्रण देगी, डेटाकंट्रैक्ट सर्राइज़र ने आपके संग्रह को क्रमबद्ध करने के बाद अपना काम किया है।

यह उपयोगी हो सकता है जब आपको परिणाम बाद में मैन्युअल रूप से विश्लेषण करना पड़ता है (दूसरे शब्दों में आप जानते हैं कि आपके संग्रह और उसके हिस्सों को ढूंढने के लिए उस XML पाठ में कौन सा तत्व देखना है)।

उदाहरण और अधिक जानकारी के लिए इस पर एक नज़र डालें:

http://msdn.microsoft.com/en-us/library/aa347850.aspx

1

यदि आप कोई सूची लौटाते हैं, तो डेटा सीरिएलाइज़र का एक्सएमएल उत्पन्न करने का एक विशिष्ट तरीका होता है। मुझे नहीं पता कि यह सूची के लिए कैसे करता है, लेकिन अगर यह एक सरणी थी तो यह ... जैसे उपयोगकर्ता ऑब्जेक्ट 1 ... आदि।

लेकिन संग्रहडेटाकंट्रैक्ट का उपयोग करके आप इसे क्रमबद्ध कर सकते हैं और इसे उन उपभोक्ताओं के लिए बेहतर तरीके से बेनकाब कर सकते हैं जो हाथ से एक्सएमएल बना सकते हैं। उदाहरण - मैं देने के लिए सक्षम हो जाएगा - CollectionDataCOntract (नाम = "ALLUSERS") // मुझे नहीं ITEMNAME या नाम

याद फिर XML की उम्मीद करने के लिए कुछ इसी तरह होगा - ... यहां उपयोगकर्ता वस्तु 1 ... आदि।

इसके लिए एक उपयोगिता है।

0

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

<SomeMessageList> 
    <Message> 
    <ID>blah</ID> 
    <data1>blah</data1> 
    <data2>etc.etc.</data2> 
    </Message> 
    <Message> 
    <ID>blah</ID> 
    <data1>blah</data1> 
    <data2>etc.etc.</data2> 
    </Message> 
    //any number of repeated <Message> here 
</SomeMessageList> 

हालांकि, अगर मैं एक सरणी या एक सूची वस्तु का इस्तेमाल किया, रूट टैग हमेशा कहा जाता था ArrayOfMessage। और अगर मैंने एक वर्ग बनाया है जिसमें संदेश ऑब्जेक्ट्स की एक सरणी है (जिसे एमएसएललिस्ट कहा जाता है), तो डब्ल्यूसीएफ मिश्रण में एक अतिरिक्त टैग के रूप में जोड़ देगा, जिसे मैं छुटकारा पाने के लिए कोई रास्ता नहीं ढूंढ सका। तो यह की तरह दिखाई देता है |:

<SomeMessageList> 
    <MsgList> 
    <Message> 
     <ID>blah</ID> 
     <data1>blah</data1> 
     <data2>etc.etc.</data2> 
    </Message> 
    //any number of repeated <Message> here 
    </MsgList> 
</SomeMessageList> 

तो CollectionDataContract बस मुझे जड़ सूची तत्व के नाम को नियंत्रित करने के लिए एक सरल मार्ग प्रशस्त किया।

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