C# 反序列化KeyValuePairs列表

C# 反序列化KeyValuePairs列表,c#,xml-serialization,C#,Xml Serialization,我有一些以下格式的XML: <ObjectData> <ModelName>MODEL_123</ModelName> <ObjectName>OBJECT_A</ObjectName> <Values> <KeyValuePair> <Key>NAME</Key> <Value>PAUL</Value> <

我有一些以下格式的XML:

<ObjectData>
  <ModelName>MODEL_123</ModelName>
  <ObjectName>OBJECT_A</ObjectName>
  <Values>
    <KeyValuePair>
      <Key>NAME</Key>
      <Value>PAUL</Value>
    </KeyValuePair>
    ...
  </Values>
</ObjectData>
...

KeyValuePair
类是否不能以我使用它的方式序列化?或者我的
ObjectData
类中有问题吗?

尝试在属性中指定元素名称:

[XmlArray("Values")]
[XmlArrayItem("KeyValuePair")]
public List<KeyValuePair<string, string>> Values { get; set; }
[XmlArray(“值”)]
[XmlArrayItem(“KeyValuePair”)]
公共列表值{get;set;}

中没有
的设置器。您必须更改数据类型。您可以装饰该属性,以便可以根据需要命名新类型

....
    [XmlArray("Values")]
    [XmlArrayItem("KeyValuePair")]  //not needed if MyItem is named KeyValuePair
    public List<MyItem> Values { get; set; }
}

public class MyItem
{
    public string Key { get; set; }
    public string Value { get; set; }
}
。。。。
[XmlArray(“值”)]
[XmlArrayItem(“KeyValuePair”)]//如果MyItem命名为KeyValuePair,则不需要
公共列表值{get;set;}
}
公共类MyItem
{
公共字符串密钥{get;set;}
公共字符串值{get;set;}
}

结合D Stanley的回答,我能够想出正确的结构:

[XmlRoot(Namespace = "")]
public class ObjectData
{
    [XmlElement(Namespace = "")]
    public string ModelName { get; set; }
    [XmlElement(Namespace = "")]
    public string ObjectName { get; set; }
    [XmlArray("Values")]
    [XmlArrayItem("KeyValuePair")] 
    public List<KeyValuePair<string, string>> Values { get; set; }
}

[Serializable]
public class KeyValuePair<K, V> {
    public K Key { get; set; }
    public V Value { get; set; }
    public KeyValuePair() { }
    public KeyValuePair(K key, V value)
    {
        this.Key = key;
        this.Value = value;
    }
}
[XmlRoot(Namespace=”“)]
公共类对象数据
{
[XmlElement(名称空间=”)]
公共字符串ModelName{get;set;}
[XmlElement(名称空间=”)]
公共字符串ObjectName{get;set;}
[XmlArray(“值”)]
[XmlArrayItem(“KeyValuePair”)]
公共列表值{get;set;}
}
[可序列化]
公共类KeyValuePair{
公钥{get;set;}
公共V值{get;set;}
公钥值对(){}
公钥值对(K键,V值)
{
这个。键=键;
这个。值=值;
}
}

请不要在标题前加上“C”之类的前缀。这就是标签的用途。可能的重复不是真正的重复。那篇文章确实帮助我找到了解决方案,但我还有第二个要求,那就是将它反序列化为List@John我明白你的意思,但我认为这有助于以后在搜索引擎中找到标题。事实上,这没有帮助。标签在任何情况下都会进入搜索引擎优化。这现在给了我正确的键值对计数,但键值和值仍然显示为空。我尝试按照您的建议删除
[XmlArrayItem(“KeyValuePair”)]
,但没有它我的列表是空的。@Paul:您创建了名为
KeyValuePair
的类吗?是的<代码>公共类KeyValuePair{…}示例类不是泛型类。通用版本将序列化为
KeyValuePairOfStringString
(或类似的东西…)。
....
    [XmlArray("Values")]
    [XmlArrayItem("KeyValuePair")]  //not needed if MyItem is named KeyValuePair
    public List<MyItem> Values { get; set; }
}

public class MyItem
{
    public string Key { get; set; }
    public string Value { get; set; }
}
[XmlRoot(Namespace = "")]
public class ObjectData
{
    [XmlElement(Namespace = "")]
    public string ModelName { get; set; }
    [XmlElement(Namespace = "")]
    public string ObjectName { get; set; }
    [XmlArray("Values")]
    [XmlArrayItem("KeyValuePair")] 
    public List<KeyValuePair<string, string>> Values { get; set; }
}

[Serializable]
public class KeyValuePair<K, V> {
    public K Key { get; set; }
    public V Value { get; set; }
    public KeyValuePair() { }
    public KeyValuePair(K key, V value)
    {
        this.Key = key;
        this.Value = value;
    }
}