2012-05-15 12 views
8

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

Type 'xxx.Client' with data contract name 'Client:http://schemas.datacontract.org/2004/07/xxx' is not expected. Add any types not known statically to the list of known types - for example, by using the KnownTypeAttribute attribute or by adding them to the list of known types passed to DataContractSerializer.

उत्तर

5

डब्ल्यूसीएफ सीधे सार वर्गों पर काम नहीं करता है। आप डेटाकंट्रैक्ट या सर्विस क्लास पर KnownType विशेषताओं का उपयोग करेंगे। नीचे उदाहरण हैं;

[DataContract] 
[KnownType(typeof(Client))] 
public class Contact 
{ 
    ... 
} 

[ServiceContract] 
[ServiceKnownType(typeof(Client))] 
public interface IMyService 
{ 
    contact getcontact(Guid id); 
} 
+0

धन्यवाद! काम करता है ठीक है – ancdev

+0

कोई समस्या नहीं है। काम कर रहे हैं तो कृपया उत्तर के रूप में स्वीकार करें। – daryal

7

आप DataContractSerializer जानते हैं कि एक ClientContact का एक प्रकार है यह बताने के लिए नेड।

ऐसा करने के कई तरीके हैं, लेकिन वे सभी KnownType विशेषता या ServiceKnownType विशेषताओं का उपयोग करके घूमते हैं।

KnownTypeClient कक्षा पर डेटाकंट्रैक्टसेरियलाइज़र को बताने के लिए रखा जा सकता है कि यह Contact का ज्ञात प्रकार है।

[DataContract] 
[KnownType(typeof(Client))] 
public class Contact{} 

KnownType भी संकेत मिलता है कि जब इस वर्ग serialising आप भी इस दूसरे वर्ग का सामना कर सकते एक वर्ग पर रखा जा सकता।

यदि आप एक DataContract वर्ग एक संपत्ति है जो एक Contact है जो वास्तव में एक Client हो सकती है, तो आपको यह करना चाहते हैं हो सकता है: इस मामले में

[DataContract] 
[KnownType(typeof(Client))] 
public class Meeting 
{ 
    Contact MeetingContact{get;} 
} 

आप दूर पर KnownType निर्दिष्ट किए बिना मिल सकता है ग्राहक। आप यह भी करना चाहेंगे यदि आपके पास ऐसी संपत्ति है जो संग्रह लौटाती है और आप संग्रह में होने वाले प्रकारों को निर्दिष्ट करना चाहते हैं।

आप, बजाय KnownType के वास्तविक प्रकार को निर्दिष्ट करने की, एक स्थिर तरीका है जिसके नाम से जाना जाता प्रकार के बजाय वापस आ जाएगी का नाम निर्दिष्ट कर सकते हैं:

[DataContract] 
[KnownType("GetKnownTypes")] 
public class Meeting 
{ 
    Contact MeetingContact{get;} 

    private static Type[] GetKnownType() 
    { 
    return new Type[]{typeof(Client)}; 
    } 
} 

तुम भी configuration file के माध्यम से जाना जाता है के प्रकार का उल्लेख कर सकते हैं।

ServiceKnownTypes एक समान तरीके से काम करते हैं, लेकिन सेवा पर ही निर्दिष्ट कर रहे हैं:

[ServiceKnownType(typeof(Client))] 
[ServiceContract()] 
public interface IMyServiceContract 
{ 

    [OperationContract] 
    Contact GetContact(); 
} 

यह दूँगी DataContactSerializer जानते हैं कि तरीकों में से किसी भी प्रकार के Client का एक प्रकार वापस आ सकते हैं की स्थापना की। ज्ञात प्रकारों के समान तरीके से आप सेवा ज्ञात प्रकार प्रदान करने के लिए एक स्थिर विधि का भी उपयोग कर सकते हैं।

+2

+1: 2 मिनट बहुत देर हो चुकी है, लेकिन बहुत अधिक उपयोगी जानकारी। –

+0

विस्तृत जानकारी +1। – daryal

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