serialize serializar objeto into from example c# xml dictionary xmlserializer

serializar - xml from object c#



¿Por qué XmlSerializer no admite el diccionario? (3)

¿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<TKey, TItem> a un método que espera un IEnumerable<KeyValuePairs<TKey, ITem>> .


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 genéricos utilizando interfaces como argumentos de tipo. También tiene una licencia totalmente permisiva.

Gracias Pawel Idzikowski!


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<KeyValuePair<K,V>> y luego (re) List<KeyValuePair<K,V>> en una tabla hash.


Puede usar ExtendedXmlSerializer . Si tienes una clase:

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

y crea una instancia de esta clase:

var obj = new TestClass { Dictionary = new Dictionary<int, string> { {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í:

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

Puede instalar ExtendedXmlSerializer desde nuget o ejecutar el siguiente comando:

Install-Package ExtendedXmlSerializer