2010-02-24 20 views
15

serializing साथ probem मैं इन कक्षाओं की है। अब, अगर मैं ErrorBase के उदाहरण के साथ ResponseFileInquiry.errors भरने, सब कुछ ठीक काम करता है, लेकिन अगर मैं विरासत में मिला प्रकार FileMissingError का एक उदाहरण जोड़ने के लिए, मैं क्रमबद्धता के दौरान एक सेवा पक्ष अपवाद:WCF विरासत में मिला प्रकार

Type 'MyNamespace.FileMissingError' with data contract name 'FileMissingError' 
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.' 

तो serializer क्योंकि भ्रमित हो रही है यह सूची को घोषित प्रकार ऑब्जेक्ट्स (एररबेस) रखने की उम्मीद कर रहा है लेकिन इसे विरासत प्रकार (FileMissingError) ऑब्जेक्ट्स मिल रहा है।

मेरे पास त्रुटि प्रकारों का पूरा समूह है और सूची में उनके संयोजन होंगे, तो मैं इसे काम करने के लिए क्या कर सकता हूं ??? किसी भी जानकारी है कि स्थिर (बहुरूपी रिश्ते तुम यहाँ व्यक्त की है) की तरह पता नहीं किया जा सकता है विशेषताओं के माध्यम से प्रदान की जानी चाहिए

[DataContract] 
[KnownType(typeof(FileMissingError))] 
public class ErrorBase {} 

त्रुटि संदेश राज्यों के रूप में,:

उत्तर

17

आप अपने आधार वर्ग

[DataContract] 
[KnownType(typeof(FileMissingError))] 
public class ErrorBase {} 

को KnownType विशेषता जोड़ना चाहिए एक बालक थोड़ी देर हो चुकी इस blog

+1

धन्यवाद, ब्लॉग एंट्री में ज्ञात प्रकारों को घोषित करने के सभी संभावित तरीके हैं। – Andrey

+0

मेरे मामले में, KnownType का उपयोग करने से बहुत मदद नहीं मिलती है क्योंकि टाइप एक अलग असेंबली से आ रहा है जिसे मैं संदर्भित नहीं करता हूं। अन्य देवता कक्षाओं को विस्तारित कर रहे हैं जो मेरे पास कुछ डेटा जोड़ने के लिए मेरे डेटाकंट्रैक्ट के लिए है। क्या होगा यदि मैं सिर्फ जो भी व्युत्पन्न वर्ग फेंकना चाहता हूं और बेस क्लास का उपयोग करना चाहता हूं? – brendonparker

+0

यह वह समाधान है जिसका उपयोग मैंने किया था: http: // stackoverflow।कॉम/ए/84143 9 0/2460073 नोट: मुझे क्लाइंटबेस पर ग्राहक डेटाकंट्रैक्टसेरियलाइज़र लागू करना पड़ा – brendonparker

7

इस प्रयास करें। इस मामले में आपको यह निर्दिष्ट करने की आवश्यकता है कि आपका FileMissingError डेटा अनुबंध इसकी बेस क्लास, ErrorBase का ज्ञात प्रकार है।

+0

तो इसका मतलब है कि मुझे यहां सभी बच्चे त्रुटि वर्ग निर्दिष्ट करने की आवश्यकता है? क्या ऐसा करने का कोई और तरीका है? मुझे इस तथ्य को पसंद नहीं है कि अभिभावक वर्ग कक्षा के वर्ग में संलग्न attriibutes और "उपयोग" खंडों के तरीके में बाल कक्षाओं के बारे में पता होगा। अपवाद ने कहा "ज्ञात प्रकारों की सूची में स्थिर रूप से ज्ञात किसी भी प्रकार को जोड़ें - उदाहरण के लिए, KnownTypeAttribute विशेषता का उपयोग करके या उन्हें DataContractSerializer को ज्ञात ज्ञात प्रकारों की सूची में जोड़कर।" तो क्या उन्हें ज्ञात प्रकारों की सूची में जोड़ने का कोई तरीका है? मैं उसको कैसे करू? – Andrey

+2

आप ज्ञात प्रकारों की सूची केवल क्रमबद्ध करने के लिए पास कर सकते हैं यदि आप मैन्युअल रूप से अनुबंधों को क्रमबद्ध कर रहे हैं। चूंकि ऐसा प्रतीत होता है कि आप डब्ल्यूसीएफ को आपके लिए सीरियलाइजेशन को संभालने की इजाजत दे रहे हैं, केवल एक चीज जो आप कर सकते हैं वह बेस क्लास में 'ज्ञात टाइप एट्रिब्यूट' जोड़ती है, प्रत्येक बच्चे के वर्ग के लिए जिसे इसे जानने की आवश्यकता होती है। –

2

में KnownType विशेषता के बारे में और अधिक पढ़ें, लेकिन शायद भविष्य की पीढ़ियों के लिए। =)

आप अपने माता पिता वर्ग के लिए हर बच्चे को कक्षा के लिए एक विशेषता जोड़ने के लिए नहीं करना चाहते हैं, तो आप ज्ञात प्रकार की एक सूची जनक वर्गों स्थिर निर्माता में

IEnumerable<Assembly> assemblies = AppDomain.CurrentDomain 
              .GetAssemblies() 
              .Where(a => !a.GlobalAssemblyCache); 

IEnumerable<Type> serializableTypes = assemblies.SelectMany(a => a.GetTypes()) 
               .Where(t => IsSerializable(t)); 

// ... 

private static bool IsSerializable(Type type) 
{ 
    return type.GetCustomAttributes(true).Any(a => a is DataContractAttribute); 
} 

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

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