wcf डब्ल्यूसीएफ पर अज्ञात प्रकार का उदाहरण पास करना




anonymous-types datacontractserializer (5)

ऐसा मत करो।

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

यह आपको कुछ लिखने में 5 मिनट का समय लगेगा जो इसे अच्छे से संभाल सकता है। इस तरह की किसी भी तकनीक का उपयोग करने से आपको सड़क के नीचे कुछ भविष्य के बिंदु पर डिबगिंग के घंटे लगेंगे।

मेरे पास एक डब्ल्यूसीएफ सेवा विधि है जो किसी ऑब्जेक्ट की अपेक्षा करती है और उसके बाद प्रतिबिंब का उपयोग करके अपनी गुणों को पुनर्प्राप्त करती है।

क्लाइंट साइड पर मैं एक अनाम प्रकार ऑब्जेक्ट बनाता हूं

var obj = new {FirstName="John", LastName="Doe"}

और इसे विधि में पास करें। मुझे अपवाद मिल रहा है:

Type '<>f__AnonymousType0`2[System.String,System.String]' cannot be serialized. 
Consider marking it with the DataContractAttribute attribute, and marking all 
of its members you want serialized with the DataMemberAttribute attribute.  
See the Microsoft .NET Framework documentation for other supported types.

मैं प्रकार या उसके सदस्यों को धारावाहिक विशेषताओं के साथ चिह्नित नहीं कर सकता क्योंकि वास्तव में कोई प्रकार नहीं है और न ही गुण स्पष्ट रूप से घोषित किए गए हैं। क्या उस समस्या को दूर करने का कोई तरीका है?


उत्तर देने का सुझाव है कि आप डब्ल्यूसीएफ पर गुमनाम प्रकार का उपयोग नहीं कर सकते हैं।

यदि आप चैनल पर अपने प्रकारों को क्रमबद्ध करने के लिए डिफ़ॉल्ट DataContractSerializer का उपयोग कर रहे हैं, तो हाँ, उत्तर सही हैं। ऐसा इसलिए है क्योंकि DataContractSerializer निम्नलिखित परिदृश्यों का समर्थन करता है:

  1. Serializable विशेषता का उपयोग serialized प्रकार
  2. एक्सएमएल सीरियलाइजेशन का उपयोग कर क्रमबद्ध प्रकार
  3. DataContract विशेषता का उपयोग करके क्रमबद्ध प्रकार
  4. सादा-ओल्ड-सी # -ऑब्जेक्ट (पीओसीओ) सीरियलाइजेशन

आदरपूर्वक, वे निम्नलिखित कारणों से अनाम प्रकारों से असफल हो जाते हैं:

  1. आप गुमनाम प्रकारों पर विशेषताओं को लागू नहीं कर सकते हैं।
  2. एक्सएमएल सीरियलाइजेशन के लिए एक डिफ़ॉल्ट पैरामीटर रहित कन्स्ट्रक्टर की आवश्यकता होती है, जो गुमनाम प्रकारों के पास नहीं है।
  3. 1 के समान।
  4. 2 के समान।

हालांकि , आपको डब्ल्यूसीएफ में अपने संदेशों को क्रमबद्ध करने के लिए DataContractSerializer का उपयोग करने के लिए मजबूर नहीं किया गया है। आप एक कस्टम संदेश फ़ॉर्मेटर बना सकते हैं जिसे आप स्वयं क्रमबद्ध करने के लिए उपयोग कर सकते हैं।

यदि आप अनुरोधों के परिणाम के रूप में भेज रहे हैं तो आपको एक समस्या है अनाम प्रकार हैं। जब आप परिणाम वापस प्राप्त करेंगे, तो यह नामस्थान के भीतर एक निश्चित नाम होगा (.NET अर्थ में नहीं, लेकिन एक एसओए अर्थ में) और आपको उस ठोस प्रकार के मैपिंग को अनाम प्रकार पर वापस संभालना होगा । हालांकि, क्योंकि आपके पास वास्तविक अज्ञात प्रकार या कोड में इसे कम करने के तरीकों तक पहुंच नहीं है (कम से कम एक गतिशील तरीके से), आपके पास किसी ऑब्जेक्ट के साथ पास करने के अलावा कोई विकल्प नहीं है, अगर यह आपको वापस भेज दिया गया है, यह बेकार है, क्योंकि हर किसी को गतिशील जैसे बुरे प्रथाओं का उपयोग करना होगा (खुद में एक बुरा अभ्यास नहीं, बल्कि इस मामले में इन सीमाओं को पाने के लिए, हाँ), या cast-by-example

तो अंत में मैं कहूंगा कि अज्ञात प्रकारों को क्रमबद्ध करना और तार पर उन्हें भेजना निश्चित रूप से संभव है, लेकिन आम तौर पर काम किया जाने वाला काम इसके लायक नहीं है।


नहीं वहाँ नहीं है। हालांकि एक विधि से गुमनाम प्रकार की वस्तुओं को वापस करने के लिए चाल और तकनीकें हैं, तो आप उन्हें डब्ल्यूसीएफ पर नहीं भेज सकते हैं।

डब्ल्यूसीएफ को अपने सभी ठोस प्रकारों को जानने की जरूरत है जो पूरे भेजे जाएंगे, क्योंकि आप वास्तव में सिर्फ .NET विधि को कॉल नहीं कर रहे हैं। इसके बजाए, संदेश कॉल को क्रमबद्ध संदेश में परिवर्तित कर दिया जाता है, और इसलिए, डब्ल्यूसीएफ कॉल पर पारित होने वाली किसी भी "चीज" को क्रमबद्ध होना चाहिए - कोई अपवाद नहीं।


जैसा कि पहले कहा गया था, वस्तुओं को deserializable होना चाहिए और इसलिए आपको पहले संरचना को परिभाषित करना होगा। हालांकि, आप उन्हें परिभाषित करने के लिए विरासत का उपयोग कर सकते हैं, और इसलिए दर्द कम करें। डब्ल्यूसीएफ ज्ञात टाइप विशेषता प्रदान करता है ताकि सेवा संचालन को बेस क्लास का ऑब्जेक्ट प्राप्त हो सके और इसे व्युत्पन्न कक्षा के किसी ऑब्जेक्ट में deserialize किया जा सके। तो आपके पास अभी भी केवल एक (या कुछ) सेवा संचालन होगा जो आपके सभी परिदृश्यों को संभाल सकता है।


आप ऑब्जेक्ट को JSON स्ट्रिंग में क्रमबद्ध कर सकते हैं और इसे डब्ल्यूसीएफ के माध्यम से भेज सकते हैं, जैसे:

//in WCF Server
dynamic mysentclass = new { FirstName = "John", LastName = "Doe" };
string jsonstring = JsonConvert.SerializeObject(mysentclass, Newtonsoft.Json.Formatting.Indented);
//send the string through WCF

//in WCF client
dynamic myreceivedclass = JsonConvert.DeserializeObject<dynamic>(jsonstring);
MessageBox.Show(myreceivedclass.FirstName.ToString() + " " + myreceivedclass.LastName.ToString());

उदाहरण जेसन.Net का उपयोग करता है, जिसे यहां प्राप्त किया जा सकता है:

http://www.nuget.org/packages/Newtonsoft.Json/

आप System.Web.Script.Serialization.JavaScriptSerializer (System.Web.Extensions.dll में) का भी उपयोग कर सकते हैं, जो Json.Net जितना शक्तिशाली नहीं है, लेकिन सरल वस्तुओं के लिए पर्याप्त होगा।





datacontract