反序列化一个 KeyValuePair 列表

5

我有以下格式的XML:

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

我希望将其反序列化为以下类:
[XmlRoot(Namespace = "")]
public class ObjectData
{
    [XmlElement(Namespace = "")]
    public string ModelName { get; set; }
    [XmlElement(Namespace = "")]
    public string ObjectName { get; set; }
    [XmlArray]
    public List<KeyValuePair<string, string>> Values { get; set; }
}

当我使用这段代码时,KeyValuePair没有被反序列化,Values属性为空。
List<ObjectData> data = new List<ObjectData>();
XmlSerializer serializer = new XmlSerializer(typeof(ObjectData));

using (XmlReader reader = XmlReader.Create(new StringReader(inputXML)))
{             
    reader.MoveToContent();
    ObjectData temp = (ObjectData)serializer.Deserialize(reader);
    data.Add(temp);
}  
< p >我的< code > ObjectData 类中,< code > KeyValuePair 类无法按我使用的方式进行序列化吗?还是存在问题?

1
请不要在标题前加上"C#"等内容,这就是标签的作用。 - John Saunders
并不是完全重复的。那篇帖子确实有助于找到解决方案,但我还有第二个要求,需要将其反序列化为列表形式。 - Paul
@John 我理解你的意思,但我认为这有助于在搜索引擎中更容易找到标题。 - Paul
实际上,不,这并没有帮助。标签无论如何都会影响SEO。 - John Saunders
那我就困惑了。在h1标签中有一个关键词怎么不会帮助SEO呢? - Paul
3个回答

4

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

[XmlArray("Values")]
[XmlArrayItem("KeyValuePair")]
public List<KeyValuePair<string, string>> Values { get; set; }

1
现在这给了我正确的键值对计数,但键和值仍然为空。 - Paul

2

结合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;
    }
}

1

KeyValuePair结构体中没有KeyValue的setter。您需要更改数据类型。您可以装饰属性,以便您可以将新类型命名为任何您想要的名称。

....
    [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; }
}

我尝试按照您的建议删除了[XmlArrayItem("KeyValuePair")],但是没有它我的List为空。 - Paul
@Paul:你创建了一个名为 KeyValuePair 的类吗? - Austin Salonen
是的。public class KeyValuePair<K, V> { ... } - Paul
示例类不是通用的。通用版本将序列化为 KeyValuePairOfStringString(或类似的内容...)。 - Austin Salonen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接