2010-04-17 13 views
25

पर कुंजी/वैल्यू जोड़े की एक सूची को क्रमबद्ध करना मेरे पास कुंजी/मूल्य जोड़े की एक सूची है जिसे मैं स्टोर करना चाहता हूं और एक्सएमएल फ़ाइल से पुनर्प्राप्त करना चाहता हूं। तो यह कार्य here वर्णित जैसा ही है। मैं चिह्नित उत्तर में सलाह का पालन करने की कोशिश कर रहा हूं (KeyValuePair और XmlSerializer का उपयोग करके) लेकिन मुझे यह काम नहीं मिल रहा है।एक्सएमएल

क्या मैं अब तक एक "सेटिंग" वर्ग है ...

public class Settings 
{ 
    public int simpleValue; 
    public List<KeyValuePair<string, int>> list; 
} 

... इस वर्ग का एक उदाहरण ...

Settings aSettings = new Settings(); 

aSettings.simpleValue = 2; 

aSettings.list = new List<KeyValuePair<string, int>>(); 
aSettings.list.Add(new KeyValuePair<string, int>("m1", 1)); 
aSettings.list.Add(new KeyValuePair<string, int>("m2", 2)); 

... और निम्नलिखित कोड एक एक्सएमएल फ़ाइल के लिए कि उदाहरण लिखने के लिए:

XmlSerializer serializer = new XmlSerializer(typeof(Settings)); 
TextWriter writer = new StreamWriter("c:\\testfile.xml"); 
serializer.Serialize(writer, aSettings); 
writer.Close(); 

परिणामी फ़ाइल है:

<?xml version="1.0" encoding="utf-8"?> 
<Settings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <simpleValue>2</simpleValue> 
    <list> 
    <KeyValuePairOfStringInt32 /> 
    <KeyValuePairOfStringInt32 /> 
    </list> 
</Settings> 

इसलिए मेरी सूची में जोड़े की न तो कुंजी और न ही मूल्य संग्रहीत किया जाता है हालांकि तत्वों की संख्या सही है। जाहिर है मैं कुछ मूल रूप से गलत कर रहा हूँ। मेरे प्रश्न हैं:

  • मैं फ़ाइल में सूची के कुंजी/मूल्य जोड़े कैसे संग्रहीत कर सकता हूं?
  • मैं सूची में मौजूद तत्वों के डिफ़ॉल्ट उत्पन्न नाम "KeyValuePairOfStringInt32" को किसी अन्य नाम जैसे "listElement" में कैसे बदल सकता हूं, मैं चाहता हूं?

उत्तर

48

KeyValuePair serializable नहीं है, क्योंकि इसमें केवल-पढ़ने योग्य गुण हैं। Here अधिक जानकारी है (थॉमस लेवेस्क के लिए धन्यवाद)। जेनरेट किए गए नाम को बदलने के लिए [XmlType] विशेषता का उपयोग करें।

इस तरह अपने खुद के परिभाषित करें:

[Serializable] 
[XmlType(TypeName="WhateverNameYouLike")] 
public struct KeyValuePair<K, V> 
{ 
    public K Key 
    { get; set; } 

    public V Value 
    { get; set; } 
} 
+3

बढ़िया है, यह काम करता है, धन्यवाद! मैंने आपकी संरचना में एक कन्स्ट्रक्टर जोड़ा है: 'सार्वजनिक KeyValuePair (के के, वी वी): यह() {कुंजी = के; मूल्य = वी; } ', इसलिए मैं परिवर्तन के बिना सूची भरने के लिए अपने कोड का उपयोग कर सकता हूं। इसके अलावा मुझे पता चला कि '[XmlType]' के विकल्प के रूप में मैं सेटिंग्स वर्ग में सूची को [XmlArrayItem (ElementName = "WhateverNameYouLike")] के साथ सजा सकता हूं। यह उपयोगी हो सकता है यदि मेरे पास 'KeyValuePair' की दो सूचियां थीं लेकिन XML फ़ाइल में तत्वों को अलग-अलग नाम देना चाहते हैं। एक बार फिर धन्यवाद! – Slauma

+0

आपकी मदद करने में खुशी हुई :) –

+6

इसका 'सीरियलज़ेबल' विशेषता के साथ कुछ लेना देना नहीं है: एक्सएमएल क्रमबद्धता की आवश्यकता नहीं है। कारण यह है कि 'कुंजी' और 'मान' गुण केवल पढ़ने के लिए –