Почему XmlSerializer не поддерживает словарь? - PullRequest
46 голосов
/ 26 мая 2010

Просто интересно, почему словарь не поддерживается XmlSerializer?

Вы можете достаточно легко обойти это, используя DataContractSerializer и записав объект в XmlTextWriter, но каковы характеристики словаря, которые мешают XmlSerializer иметь дело с тем, что это действительно массив KeyValuePairs.

Фактически, вы можете передать IDictionary<TKey, TItem> методу, ожидающему IEnumerable<KeyValuePairs<TKey, ITem>>.

Ответы [ 3 ]

27 голосов
/ 26 мая 2010

Для хеш-таблиц обычно требуются поставщики хеш-кода и средств сравнения равенств. Они не могут быть легко сериализованы в XML и определенно не будут переносимыми.

Но я думаю, что вы уже нашли свой ответ. Просто сериализуйте хеш-таблицу как List<KeyValuePair<K,V>>, а затем (пере) создайте ее в хеш-таблицу.

7 голосов
/ 23 сентября 2011

Это уже поздно - но я нашел этот вопрос, когда сам искал ответ, и подумал, что поделюсь своим окончательным ответом, который должен был заменить XmlSerializer другим инструментом, который будет сериализовать все:

http://www.sharpserializer.com

Это работало для меня прямо из коробки, сериализовав словари, многоуровневые пользовательские типы и даже обобщенные типы, используя интерфейсы в качестве аргументов типов. Также имеет полностью разрешительную лицензию.

Спасибо, Павел Идзиковский!

3 голосов
/ 22 сентября 2016

Вы можете использовать ExtendedXmlSerializer .Если у вас есть класс:

public class TestClass
{
    public Dictionary<int, string> Dictionary { get; set; }
}

и создан экземпляр этого класса:

var obj = new TestClass
{
    Dictionary = new Dictionary<int, string>
    {
        {1, "First"},
        {2, "Second"},
        {3, "Other"},
    }
};

Вы можете сериализовать этот объект с помощью ExtendedXmlSerializer:

var serializer = new ConfigurationContainer()
    .UseOptimizedNamespaces() //If you want to have all namespaces in root element
    .Create();

var xml = serializer.Serialize(
    new XmlWriterSettings { Indent = true }, //If you want to formated xml
    obj);

Вывести xmlбудет выглядеть так:

<?xml version="1.0" encoding="utf-8"?>
<TestClass xmlns:sys="https://extendedxmlserializer.github.io/system" xmlns:exs="https://extendedxmlserializer.github.io/v2" xmlns="clr-namespace:ExtendedXmlSerializer.Samples;assembly=ExtendedXmlSerializer.Samples">
  <Dictionary>
    <sys:Item>
      <Key>1</Key>
      <Value>First</Value>
    </sys:Item>
    <sys:Item>
      <Key>2</Key>
      <Value>Second</Value>
    </sys:Item>
    <sys:Item>
      <Key>3</Key>
      <Value>Other</Value>
    </sys:Item>
  </Dictionary>
</TestClass>

Вы можете установить ExtendedXmlSerializer из nuget или выполнить следующую команду:

Install-Package ExtendedXmlSerializer
...