Десериализация списка KeyValuePairs - PullRequest
3 голосов
/ 06 февраля 2012

У меня есть 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 s не десериализуются, а свойство 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);
}  

Разве класс KeyValuePair не сериализуем в способе, которым я его использую? Или есть проблема в моем ObjectData классе?

Ответы [ 3 ]

3 голосов
/ 06 февраля 2012

Попробуйте указать имена элементов в ваших атрибутах:

[XmlArray("Values")]
[XmlArrayItem("KeyValuePair")]
public List<KeyValuePair<string, string>> Values { get; set; }
2 голосов
/ 06 февраля 2012

Объединив ответ Д. Стэнли с этим постом , я смог придумать правильную структуру:

[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 голос
/ 06 февраля 2012

В KeyValuePair struct отсутствует установщик для Key или Value.Вам придется изменить тип данных.Вы можете украсить свойство, чтобы вы могли называть новый тип как хотите.

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