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