Сериализация списка пар ключ / значение в XML - PullRequest
29 голосов
/ 17 апреля 2010

У меня есть список пар ключ / значение, которые я хотел бы сохранить и извлечь из файла 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:

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 Ответ

55 голосов
/ 17 апреля 2010

KeyValuePair не сериализуем, потому что он имеет свойства только для чтения Здесь - дополнительная информация (спасибо Томасу Левеску). Для изменения сгенерированного имени используйте атрибут [XmlType].

Определите свое собственное, как это:

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

  public V Value 
  { get; set; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...