代码之家  ›  专栏  ›  技术社区  ›  Slauma

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

  •  29
  • Slauma  · 技术社区  · 14 年前

    我有一个要存储在XML文件中并从XML文件中检索的键/值对列表。所以这个任务和描述的类似 here . 我正在尝试按照标记的答案中的建议(使用 键值空气 和A 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”?
    1 回复  |  直到 14 年前
        1
  •  55
  •   Petar Minchev    14 年前

    KeyValuePair不可序列化,因为它具有只读属性。 Here 更多信息(多亏了托马斯·莱夫斯基)。 要更改生成的名称,请使用 [XmlType] 属性。

    这样定义自己:

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