Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 将键/值对列表序列化为XML_.net_Xml_List_Xml Serialization - Fatal编程技术网

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

.net 将键/值对列表序列化为XML,.net,xml,list,xml-serialization,.net,Xml,List,Xml Serialization,我有一个键/值对列表,我希望存储在XML文件中并从中检索。因此,此任务与前面描述的类似。我试图使用KeyValuePair和XmlSerializer来遵循标记答案中的建议,但我无法让它正常工作 到目前为止,我有一个设置类 public class Settings { public int simpleValue; public List<KeyValuePair<string, int>> list; } Settings aSettings = n

我有一个键/值对列表,我希望存储在XML文件中并从中检索。因此,此任务与前面描述的类似。我试图使用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 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?
KeyValuePair不可序列化,因为它具有只读属性。多亏了Thomas Levesque提供了更多信息。 要更改生成的名称,请使用[XmlType]属性

这样定义您自己的:

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

  public V Value 
  { get; set; }
}

太好了,很有效,谢谢!我已经向您的struct:public-KeyValuePairK k,V:this{Key=k;Value=V;}添加了一个构造函数,因此我可以使用我的代码填充列表而不做任何更改。我还发现,作为[XmlType]的替代方法,我可以使用[XmlArrayItemElementName=WhateverNameYouLike]来装饰Settings类中的列表。如果我有两个KeyValuePair列表,但希望在XML文件中为元素指定不同的名称,那么它可能会很有用。再次感谢!它与Serializable属性无关:XML序列化不需要它。原因是键和值属性被读取-only@Thomas哇,谢谢。您是对的—只需提及一下:当我的设置类中有两个不同类型的KeyValuePair列表时,应用于类模板的[XmlType]属性变成了一个问题,例如一个列表和一个列表。然后XmlSerializer的构造函数抛出一个异常,并抱怨我对两种不同的类型具有相同的XML类型名,这似乎是禁止的。现在,我已经删除了XmlType属性,并将[XmlArrayItem…]直接应用于我在第一条评论中提到的列表成员+1给你
[Serializable]
[XmlType(TypeName="WhateverNameYouLike")]
public struct KeyValuePair<K, V>
{
  public K Key 
  { get; set; }

  public V Value 
  { get; set; }
}