Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

http://www.sharpserializer.com

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

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

Ответ 3

Вы можете использовать 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:

ExtendedXmlSerializer serializer = new ExtendedXmlSerializer();
var xml = serializer.Serialize(obj);

Результат xml будет выглядеть так:

<TestClass type="Samples.TestClass">
  <Dictionary>
    <Item>
        <Key>1</Key>
        <Value>First</Value>
    </Item>
    <Item>
        <Key>2</Key>
        <Value>Second</Value>
    </Item>
    <Item>
        <Key>3</Key>
        <Value>Other</Value>
    </Item>
  </Dictionary>
</TestClass>

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

Install-Package ExtendedXmlSerializer