2009-04-10 13 views
6

ठीक है तो मुझे अपने ऑब्जेक्ट ग्राफ़ के साथ काम करने वाले DataContractSerializer मिला। अधिक जानकारी के लिए मेरे पिछले प्रश्न देखें।रनटाइम टाइप: http: //schemas.datacontract.org/2004/07/ सिस्टम की उम्मीद नहीं है

Serialization/Derialization of a tree structure

The deserializer has no knowlege of any type that maps to this contract

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

प्रत्येक ऑब्जेक्ट में शब्दकोश (स्ट्रिंग कुंजी, वस्तु मूल्य) मान यह "उपयोगकर्ता गुण" से किसी के लिए निर्धारित किया है

[DataMember] 
private Dictionary<string, Type> _UserPropertyDefinitions; 

मेरे वस्तु ग्राफ ठीक serializes जब इस संपत्ति के एक खाली संग्रह है, फिर भी स्टोर करने के लिए संग्रह एक बार मैं इस संग्रह के लिए कोई कस्टम गुण जोड़ने DataContractSerializer के साथ क्रमबद्ध करने का प्रयास करते समय मुझे निम्न अपवाद मिलता है।

प्रकार डेटा अनुबंध नाम साथ 'System.RuntimeType' 'RuntimeType: http://schemas.datacontract.org/2004/07/System' की उम्मीद नहीं है। ज्ञात प्रकारों की सूची में स्थिर रूप से ज्ञात नहीं है - उदाहरण के लिए, KnownTypeAttribute विशेषता का उपयोग करके या उन्हें ज्ञात प्रकार की सूची में डेटाकंट्रैक्टसेरियलाइज़र को पास करके।

यदि मैं इस क्षेत्र के लिए डेटामेम्बर विशेषता को हटा देता हूं तो मैं अपवाद प्राप्त करने के साथ क्रमबद्ध/deserialize कर सकते हैं, लेकिन निश्चित रूप से मैं इस क्षेत्र में बनाई गई सेटिंग्स को खो देता हूं।

+1

देरी प्रतिक्रिया के लिए खेद है ;- या तो टाइप करें। गेट टाइप() या असेंबली। गेट टाइप() –

उत्तर

7

मुझे पूरा यकीन है कि Type बहुत अच्छी तरह से क्रमबद्ध नहीं होने वाला है - और तर्कसंगत रूप से यह किसी भी डेटा-अनुबंध में नहीं है, क्योंकि (कार्यान्वयन विशिष्ट होने के कारण) यह डेटा के मुख्य उद्देश्यों में से एक को हरा देता है अनुबंध ...

हालांकि, मैं उम्मीद सबसे अच्छा तरीका स्वैप करने के लिए, एक Dictionary<string,string> के लिए कि का उपयोग करते हुए किया जाएगा Type के AssemblyQualifiedName या FullName

+0

गीज़ मार्क क्या आपके पास कोई वास्तविक काम नहीं है? :-) लेकिन गंभीरता से मैं वास्तव में मदद की सराहना करता हूं। तो मूल रूप से मैं प्रकार का नाम संग्रहीत करता हूं, और उसके बाद नाम से वास्तविक प्रकार को पुनः प्राप्त करता हूं? मुझे पता है कि प्रकार का नाम कैसे ढूंढें, लेकिन जब मैं केवल नाम जानता हूं तो मैं बाद में एक प्रकार कैसे प्राप्त करूं? –

+0

@Marc Gravell आप इस प्रकार को कैसे प्राप्त करेंगे जब आपके पास केवल नाम है यदि यह ज्ञात फार्मवर्क प्रकार नहीं है, क्या आप पूरी असेंबली को कुछ कैसे भेजेंगे? –

+0

@eran well, एक असेंबली क्वालिफाइडनाम "बस" नाम नहीं है, लेकिन हां यह समस्याग्रस्त है, खासकर यदि असेंबली अलग हैं। यदि दो कार्यान्वयन उनके ज्ञात प्रकारों को वर्गीकृत कर सकते हैं, तो शायद एक enum पर्याप्त होगा? प्रोटोबफ-नेट में, क्रमबद्ध करने के लिए टाइप I उपयोगकर्ता को <==> स्ट्रिंग के लिए कार्यान्वयन प्रदान करने दें, ताकि वे इसे मैन्युअल रूप से मैप कर सकें। –

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