¿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