2010-05-26 22 views
42

सिर्फ उत्सुक है कि क्यों XmlSerializer द्वारा शब्दकोश समर्थित नहीं है?XmlSerializer शब्दकोश का समर्थन क्यों नहीं करता है?

आप DataContractSerializer का उपयोग कर और एक XmlTextWriter करने के लिए वस्तु लिख कर आसानी से पर्याप्त इसके चारों ओर प्राप्त कर सकते हैं, लेकिन एक शब्दकोश यह मुश्किल एक XmlSerializer यह वास्तव में KeyValuePairs की एक सरणी है पर विचार के साथ सौदा करने के लिए करता है कि विशेषताओं का।

वास्तव में, आप IEnumerable<KeyValuePairs<TKey, ITem>> की अपेक्षा रखने वाली विधि में IDictionary<TKey, TItem> पास कर सकते हैं।

उत्तर

27

हैशटेबल्स को आमतौर पर हैशकोड और समानता तुलनाकर्ता प्रदाताओं की आवश्यकता होती है। इन्हें एक्सएमएल में आसानी से क्रमबद्ध नहीं किया जा सकता है, और निश्चित रूप से पोर्टेबल नहीं होगा।

लेकिन मुझे लगता है कि आपको पहले ही आपका जवाब मिल गया है। बस List<KeyValuePair<K,V>> के रूप में हैशटेबल को क्रमबद्ध करें और फिर (पुनः) इसे हैशटेबल में बनाएं।

+3

या का उपयोग करें कि कोड: http://weblogs.asp.net/pwelter34/archive/2006/05/03/444961.aspx – prostynick

+3

क्या तरीकों/शब्दकोश में गुणों का अर्थ है कि इसे हैश टेबल के रूप में कार्यान्वित किया जाना चाहिए? शब्दकोश और आईडीकी कुंजी/वैल्यू जोड़े के संग्रह हैं और हैशटेबल कार्यान्वयन से अलग हैं। एक क्रमिक परिप्रेक्ष्य से हमारा लक्ष्य अस्थिर स्मृति से डेटा को बाद में लोड करने में सक्षम होने के लिए लगता है। एक इंटरफेस के एक अलग कंक्रीट कार्यान्वयन में * किसी भी * डेटा को फिर से लोड करने के परिणामस्वरूप विभिन्न व्यवहार होते हैं। – Jeremy

+0

Serializing KeyValuePair काम नहीं करता है। आप एक खाली टैग के साथ खत्म हो जाएगा। देखें: https://stackoverflow.com/questions/2658916/serializing-a-list-of-key-value-pairs-to-xml – NullAndVoid

6

यह देर से देर हो चुकी है - लेकिन मुझे यह सवाल मिला कि मुझे जवाब तलाशने के दौरान, और सोचा कि मैं अपना अंतिम जवाब साझा करूंगा जो एक्सएमएलएसरियललाइज़र को एक अलग से जोड़ना था जो सब कुछ क्रमबद्ध करेगा।

http://www.sharpserializer.com

यह मेरे लिए काम किया सीधे बॉक्स से बाहर, शब्दकोश serialising, और मल्टी लेयर्ड कस्टम प्रकार, और यहां तक ​​कि आनुवंशिकी प्रकार तर्क के रूप में इंटरफेस का उपयोग कर। एक पूरी तरह से अनुमोदित लाइसेंस भी है।

धन्यवाद Pawel Idzikowski!

+4

DataContractSerializer शब्दकोशों को क्रमबद्ध भी करेगा, और अब .NET Framework का हिस्सा है। –

1

आप ExtendedXmlSerializer का उपयोग कर सकते हैं। आप एक वर्ग है, तो:

public class TestClass 
{ 
    public Dictionary<int, string> Dictionary { get; set; } 
} 

और इस वर्ग के उदाहरण बनाने के लिए:

var serializer = new ConfigurationContainer() 
    .UseOptimizedNamespaces() //If you want to have all namespaces in root element 
    .Create(); 

var xml = serializer.Serialize(
    new XmlWriterSettings { Indent = true }, //If you want to formated xml 
    obj); 

आउटपुट एक्सएमएल तरह दिखेगा::

var obj = new TestClass 
{ 
    Dictionary = new Dictionary<int, string> 
    { 
     {1, "First"}, 
     {2, "Second"}, 
     {3, "Other"}, 
    } 
}; 

आप इस वस्तु ExtendedXmlSerializer का उपयोग कर क्रमानुसार कर सकते हैं

<?xml version="1.0" encoding="utf-8"?> 
<TestClass xmlns:sys="https://extendedxmlserializer.github.io/system" xmlns:exs="https://extendedxmlserializer.github.io/v2" xmlns="clr-namespace:ExtendedXmlSerializer.Samples;assembly=ExtendedXmlSerializer.Samples"> 
    <Dictionary> 
    <sys:Item> 
     <Key>1</Key> 
     <Value>First</Value> 
    </sys:Item> 
    <sys:Item> 
     <Key>2</Key> 
     <Value>Second</Value> 
    </sys:Item> 
    <sys:Item> 
     <Key>3</Key> 
     <Value>Other</Value> 
    </sys:Item> 
    </Dictionary> 
</TestClass> 

आप nuget से ExtendedXmlSerializer स्थापित करने या निम्न आदेश चला सकते हैं:

Install-Package ExtendedXmlSerializer 
संबंधित मुद्दे