2010-05-26 14 views
42

¿Simplemente por qué el diccionario no es compatible con XmlSerializer?¿Por qué XmlSerializer no admite el diccionario?

que le permite desplazarse con bastante facilidad mediante el uso de DataContractSerializer y escribir el objeto a una XmlTextWriter, pero ¿cuáles son las características de un diccionario que hace que sea difícil para un XmlSerializer para lidiar con la consideración de que es realmente una serie de KeyValuePairs.

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

Respuesta

27

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

Pero creo que ya encontró su respuesta. Simplemente serialice la tabla hash como List<KeyValuePair<K,V>> y luego (re) contruya en una tabla hash.

+3

O utilice el código: http://weblogs.asp.net/pwelter34/archive/2006/05/03/444961.aspx – prostynick

+3

¿Qué métodos/propiedades en Diccionario implican que debe implementarse como una tabla hash? Dictionary e IDictionary son colecciones de pares Key/Value y son distintos de la implementación de Hashtable. Desde una perspectiva de serialización nuestro objetivo parece ser sacar datos de la memoria volátil para poder volver a cargarlos en otro momento. Recargar * cualquier * información en una implementación concreta diferente de una interfaz va a dar como resultado un comportamiento diferente. – Jeremy

+0

Serializando KeyValuePair no funciona. Usted terminará con una etiqueta vacía. Ver: https://stackoverflow.com/questions/2658916/serializing-a-list-of-key-value-pairs-to-xml – NullAndVoid

6

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

http://www.sharpserializer.com

que trabajó para mí directamente de la caja, serialising Diccionarios y tipos personalizados de varias capas, e incluso la genética utilizando interfaces como argumentos de tipo. También tiene una licencia totalmente permisiva.

Gracias Pawel Idzikowski!

+4

DataContractSerializer también serializará diccionarios, y ahora es parte de .NET Framework. –

1

Puede usar ExtendedXmlSerializer. Si usted tiene una clase:

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

y crear 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); 

XML de salida 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 de nuget o ejecutar el siguiente comando:

Install-Package ExtendedXmlSerializer 
Cuestiones relacionadas