2010-05-26 3 views
42

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

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

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

ответ

27

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

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

+3

Или использовать этот код: http://weblogs.asp.net/pwelter34/archive/2006/05/03/444961.aspx – prostynick

+3

Какие методы/properties в словаре подразумевает, что он должен быть реализован как хеш-таблица? Словарь и IDictionary - это коллекции пар Key/Value и отличаются от реализации Hashtable. С точки зрения сериализации наша цель состоит в том, чтобы извлечь данные из энергозависимой памяти, чтобы иметь возможность загрузить ее позже. Перезагрузка * любых * данных в другую конкретную реализацию интерфейса приведет к поведению. – Jeremy

+0

Сериализация KeyValuePair не работает. У вас будет пустой тег. См. Https://stackoverflow.com/questions/2658916/serializing-a-list-of-key-value-pairs-to-xml – NullAndVoid

6

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

http://www.sharpserializer.com

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

Спасибо Pawel Idzikowski!

+4

DataContractSerializer также сериализует словари и теперь является частью .NET Framework. –

1

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