मेरे पास एक ऑब्जेक्ट पेड़ है जिसे मैं JSON से DataContractJsonSerializer
के साथ क्रमबद्ध कर रहा हूं। Dictionary<TKey, TValue>
धारावाहिक हो जाता है, लेकिन मैं मार्कअप पसंद नहीं है - आइटम इस तरह गाया नहीं कर रहे हैं:सीरियलाइज डिक्शनरी <टीके, टीवीएयू> जेएसओएन से डेटाकंट्रैक्टजसन एसरियलाइज़र
{key1:value, key2:value2}
बल्कि धारावाहिक KeyValuePair<TKey, TValue>
ऑब्जेक्ट की श्रृंखला की तरह:
[{
"__type":"KeyValuePairOfstringanyType:#System.Collections.Generic",
"key":"key1",
"value":"value1"
},
{
"__type":"KeyValuePairOfstringanyType:#System.Collections.Generic",
"key":"key2",
"value":"value2"
}]
बदसूरत, ऐसा नहीं है ?
तो, मैं ISerializable
लागू करता है जो सामान्य ऑब्जेक्ट में जेनेरिक डिक्शनरी को लपेटकर इसे से बचता हूं, और मैं GetObjectData
विधि में अपने कस्टम क्रमबद्धता को लागू करता हूं (और इसमें केवल 3 लाइनें होती हैं)।
अब समस्या - मैं अपने वर्ग Dictionary<TKey, TValue>
से निकाले जाते हैं नहीं कर सकते, तो मैं एक निजी Dictionary<TKey, TValue>
क्षेत्र के लिए लागू किया जा रहा अपने कस्टम कक्षा में सभी तर्क (Add
, Clear
, आदि) को लागू करने,। विरासत बेहतर होगा क्योंकि मेरे कस्टम ऑब्जेक्ट का उपयोग करते समय मेरे पास मेरे सामान्य निपटान में सभी सामान्य शब्दकोश कार्यक्षमता होगी।
Dictionary<TKey, TValue>
लागू करता है अपने आप ही ISerializable
है, और DataContractJsonSerializer
इस तरह भले ही मैं अपने कस्टम वर्ग से स्पष्ट रूप से ISerializable
लागू इस कार्यान्वयन को पसंद करते हैं, लगता है:
public class MyClass : Dictionary<string, object>, ISerializable
{
public override void GetObjectData(SerializationInfo info,
StreamingContext context)
}
मैं वास्तव में हैरान था कि यह संभव है क्योंकि यह स्पष्ट रूप से स्पष्ट इंटरफ़ेस कार्यान्वयन का उपयोग करने में सक्षम होने के बिना दो बार एक ही इंटरफ़ेस को कार्यान्वित करने की अनुमति देता है - इसलिए मैंने ब्लॉग पोस्ट about multiple interface implementation
में स्थिति में अधिक विस्तार से स्थिति का विश्लेषण किया, तो, प्रयोगों मैं वहाँ किया के अनुसार, serializer ISerializable की मेरी कार्यान्वयन बुला होना चाहिए, कोई फर्क नहीं पड़ता कास्टिंग किस प्रकार आंतरिक रूप से प्रयोग किया जाता है -
((ISerializable)((Dictionary<,>)obj)).GetObjectData(...)
या:
((ISerializable)obj).GetObjectData(...)
लेकिन यह जाहिरा तौर पर नहीं है जैसा कि मैं परिणामस्वरूप जेएसओएन में देखता हूं कि KeyValuePair<TKey, TValue>
धारावाहिक अभी भी कहा जा रहा है। क्या हो रहा है कि मैं याद कर रहा हूँ?
अद्यतन: उत्तर और टिप्पणियां जो मैं अब तक प्राप्त कर रहा हूं, वे केवल कामकाज का सुझाव दे रहे हैं।मैं उल्लेख किया है, तथापि, कि मैं एक समाधान है कि इस सवाल पूछने के साथ बहुत अच्छी तरह से काम करता है तो मैं 2 लक्ष्य हैं:
अंततः यह मूल डिजाइन के साथ काम करने के - और मैं क्रमबद्धता तर्क को बदलने के लिए नहीं जा रहा हूँ इसके लिए, इस पर बहुत सारे कोड और तर्क निर्भर हैं
मेरे सीरियलाइजेशन कोड का उपयोग करके
DataContractJsonSerializer
क्यों नहीं है, इस रहस्य को अनदेखा करने के लिए - जैसा कि मैंने ब्लॉग पोस्ट में देखा है, मैंने बनाया है इंटरफ़ेस कार्यान्वयन और विरासत के साथ सभी प्रकार के प्रयोगों और मुझे विश्वास था कि मैं प्रक्रिया के सभी इंस और आउट को समझ रहा हूं, इसलिए मैं समझने में असफल रहा हूं कि इसमें क्या हो रहा है केस
ऐसा लगता है: विरासत के बारे में चिंता करने की जरूरत नहीं है। एक शब्दकोश से प्राप्त करने की कोशिश करने से बहुत कम काम। –
आप 'JavaScriptSerializer' का भी उपयोग कर सकते हैं क्योंकि यह आपके द्वारा पसंद किए जाने वाले शब्दकोशों को क्रमबद्ध करता है। –
@RitchMelton - शब्दकोश से विरासत में बहुत काम नहीं है, लेकिन मुझे यह स्वीकार करना होगा कि आईनेमरेबल को कार्यान्वित करना और सदस्य की शब्दकोश को वापस करना, पहली नजर में प्राप्त करना मेरे कामकाज से बेहतर प्रतीत होता है - – Vroomfundel