2010-04-17 11 views
25

我有一個要存儲在XML文件中並從中檢索的鍵/值對的列表。所以這個任務與here描述的相似。我試圖按照標記答案中的建議(使用KeyValuePairXmlSerializer),但我沒有得到它的工作。將鍵/值對列表序列化爲XML

我至今是一個 「設置」 類...

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)); 

...以下代碼該實例寫入一個XML文件:

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不可序列化,因爲它具有隻讀屬性。 Here是更多信息(感謝托馬斯萊維斯克)。 要更改生成的名稱,請使用[XmlType]屬性。

定義你自己是這樣的:

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

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

大,它的工作原理,謝謝!我在你的結構中添加了一個構造函數:'public KeyValuePair(K k,V v):this(){Key = k;值= v; }',所以我可以使用我的代碼來填充列表而不用更改。我還發現,作爲'[XmlType]'的替代品,我可以用'[XmlArrayItem(ElementName =「WhateverNameYouLike」)]''在Settings類中修飾列表。如果我有兩個'KeyValuePair'列表,但希望在XML文件中爲這些元素指定不同的名稱,那麼這會很有用。再次感謝! – Slauma 2010-04-17 16:32:23

+0

很高興幫助您:) – 2010-04-17 16:49:22

+6

它與'Serializable'屬性無關:XML序列化不需要它。原因是'Key'和'Value'屬性是隻讀的 – 2010-04-17 17:48:30