将键/值对列表序列化为XML

时间:2010-04-17 15:34:19

标签: .net xml list xml-serialization

我有一个我希望存储在XML文件中并从XML文件中检索的键/值对列表。所以此任务与描述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));

...以及将该实例写入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”?

1 个答案:

答案 0 :(得分:55)

KeyValuePair不可序列化,因为它具有只读属性。 Here是更多信息(感谢Thomas Levesque)。 要更改生成的名称,请使用[XmlType]属性。

像这样定义你自己:

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

  public V Value 
  { get; set; }
}