Почему XmlSerializer не поддерживает словарь?
Просто интересно, почему словарь не поддерживается XmlSerializer
?
Вы можете легко обойти это, используя DataContractSerializer
и записывая объект в XmlTextWriter
, но каковы характеристики словаря, что затрудняет работу XmlSerializer
с учетом его действительно массива KeyValuePairs.
Фактически вы можете передать IDictionary<TKey, TItem>
методу, ожидающему IEnumerable<KeyValuePairs<TKey, ITem>>
.
Ответы
Ответ 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