Why doesn't XmlSerializer support Dictionary? Why doesn't XmlSerializer support Dictionary? xml xml

Why doesn't XmlSerializer support Dictionary?


Hashtables need hashcode and equality comparer providers generally. These cant be serialized easily in XML, and definitely will not be portable.

But I think you already found your answer. Just serialize the hashtable as a List<KeyValuePair<K,V>> and then (re)construct it into a hashtable.


This is waaay late - but I found this question whilst looking for the answer myself, and thought I'd share my eventual answer which was to replace XmlSerializer with a different tool that will serialize everything:

http://www.sharpserializer.com

It worked for me straight out of the box, serializing Dictionaries, and multi-layered custom types, and even generics using interfaces as type arguments. Also has a fully permissive license.

Thank you Pawel Idzikowski!


You can use ExtendedXmlSerializer. If you have a class:

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

and create instance of this class:

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

You can serialize this object using 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);

Output xml will look like:

<?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>

You can install ExtendedXmlSerializer from nuget or run the following command:

Install-Package ExtendedXmlSerializer