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




anonymous-types datacontractserializer (4)

आप ऑब्जेक्ट को 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 जितना शक्तिशाली नहीं है, लेकिन सरल वस्तुओं के लिए पर्याप्त होगा।

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

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

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.

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


आपको पहले से ही जवाब मिल गया है। यह नहीं किया जा सकता है।

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


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


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

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





datacontract