¿Por qué XmlSerializer no admite el diccionario?

¿Solo curiosidad por saber por qué Dictionary no es compatible con XmlSerializer ?

Puede sortearlo con bastante facilidad utilizando DataContractSerializer y escribiendo el objeto en un XmlTextWriter , pero ¿cuáles son las características de un diccionario que hace que sea difícil para un XmlSerializer considerar que es realmente una matriz de KeyValuePairs?

De hecho, puede pasar un IDictionary a un método que espera un IEnumerable<KeyValuePairs> .

Las tablas hash necesitan generalmente proveedores de códigos de claves y comparadores de igualdad. Estos no se pueden serializar fácilmente en XML, y definitivamente no serán portátiles.

Pero creo que ya encontraste tu respuesta. Simplemente serialice la tabla hash como una List> y luego (re) List> en una tabla hash.

Esto se acabó tarde, pero encontré esta pregunta mientras buscaba la respuesta yo mismo, y pensé en compartir mi respuesta final, que era reemplazar XmlSerializer con una herramienta diferente que serializaría todo:

http://www.sharpserializer.com

Me funcionó directamente, serializando Diccionarios, y tipos personalizados de varias capas, e incluso generics utilizando interfaces como argumentos de tipo. También tiene una licencia totalmente permisiva.

Gracias Pawel Idzikowski!

Puede usar ExtendedXmlSerializer . Si tienes una clase:

 public class TestClass { public Dictionary Dictionary { get; set; } } 

y crea una instancia de esta clase:

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

Puede serializar este objeto usando 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); 

El resultado xml se verá así:

     1 First   2 Second   3 Other    

Puede instalar ExtendedXmlSerializer desde nuget o ejecutar el siguiente comando:

 Install-Package ExtendedXmlSerializer