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

Sla*_*uma 30 .net xml list xml-serialization

我有一个键/值对列表,我想存储和从XML文件中检索.所以此任务与此处描述的类似.我试图遵循标记答案中的建议(使用KeyValuePairXmlSerializer),但我没有得到它的工作.

到目前为止,我所拥有的是"设置"课程......

public class Settings
{
    public int simpleValue;
    public List<KeyValuePair<string, int>> list;
}
Run Code Online (Sandbox Code Playgroud)

......这个班的一个例子......

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));
Run Code Online (Sandbox Code Playgroud)

...以及将该实例写入XML文件的以下代码:

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

生成的文件是:

<?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>
Run Code Online (Sandbox Code Playgroud)

因此,虽然元素的数量是正确的,但是我的列表中的对的键和值都没有存储.显然我做的事情基本上是错的.我的问题是:

  • 如何将列表的键/值对存储在文件中?
  • 如何将列表中元素的默认生成名称"KeyValuePairOfStringInt32"更改为我想要的其他名称,如"listElement"?

Pet*_*hev 56

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

像这样定义你自己:

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

  public V Value 
  { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

  • 它与`Serializable`属性无关:XML序列化不需要它.原因是`Key`和`Value`属性是只读的 (7认同)
  • 太棒了,它有效,谢谢!我在你的结构中添加了一个构造函数:`public KeyValuePair(K k,V v):this(){Key = k; 值= v; }`,所以我可以使用我的代码来填充列表而无需更改.另外我发现作为`[XmlType]的替代方法`我可以使用`[XmlArrayItem(ElementName ="WhateverNameYouLike")]`来装饰Settings类中的列表.如果我有两个`KeyValuePair`列表但想要在XML文件中给出不同的名称,那么它会很有用.再次感谢! (3认同)
  • 刚提到:当我在Settings类中有两个不同类型的KeyValuePair列表时,应用于类模板的`[XmlType]`属性被证明是一个问题,例如`List <KeyValuePair <string,int >> `和`List <KeyValuePair <int,int >>`.然后XmlSerializer的构造函数抛出一个异常并抱怨我有两个不同类型的XML-TypeName,这似乎是被禁止的.现在我已经删除了XmlType属性并将`[XmlArrayItem ...]`直接应用于我的第一条评论中提到的列表成员. (2认同)