2010-04-17 22 views
25

Tengo una lista de pares clave/valor que me gustaría almacenar y recuperar de un archivo XML. Entonces esta tarea es similar a la descrita here. Estoy tratando de seguir el consejo en la respuesta marcada (usando un KeyValuePair y un XmlSerializer) pero no lo hago funcionar.Serializando una lista de pares clave/valor en XML

Lo que tengo hasta ahora es una clase de "Configuración" ...

public class Settings 
{ 
    public int simpleValue; 
    public List<KeyValuePair<string, int>> list; 
} 

... una instancia de esta clase ...

Settings aSettings = new Settings(); 

aSettings.simpleValue = 2; 

aSettings.list = new List<KeyValuePair<string, int>>(); 
aSettings.list.Add(new KeyValuePair<string, int>("m1", 1)); 
aSettings.list.Add(new KeyValuePair<string, int>("m2", 2)); 

... y el siguiente código escribir esa instancia en un archivo XML:

XmlSerializer serializer = new XmlSerializer(typeof(Settings)); 
TextWriter writer = new StreamWriter("c:\\testfile.xml"); 
serializer.Serialize(writer, aSettings); 
writer.Close(); 

El archivo resultante es:

<?xml version="1.0" encoding="utf-8"?> 
<Settings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <simpleValue>2</simpleValue> 
    <list> 
    <KeyValuePairOfStringInt32 /> 
    <KeyValuePairOfStringInt32 /> 
    </list> 
</Settings> 

De modo que ni la clave ni el valor de los pares en mi lista se almacenan aunque la cantidad de elementos sea correcta. Obviamente estoy haciendo algo básicamente malo. Mis preguntas son:

  • ¿Cómo puedo almacenar los pares clave/valor de la lista en el archivo?
  • ¿Cómo puedo cambiar el nombre generado por defecto "KeyValuePairOfStringInt32" de los elementos de la lista por otro nombre como "listElement" que me gustaría tener?

Respuesta

48

KeyValuePair no es serializable, porque tiene propiedades de solo lectura. Here es más información (gracias a Thomas Levesque). Para cambiar el nombre generado use el atributo [XmlType].

definir sus propios así:

[Serializable] 
[XmlType(TypeName="WhateverNameYouLike")] 
public struct KeyValuePair<K, V> 
{ 
    public K Key 
    { get; set; } 

    public V Value 
    { get; set; } 
} 
+3

Grande, funciona, gracias! Agregué un constructor a tu estructura: 'public KeyValuePair (K k, V v): this() {Key = k; Valor = v; } ', entonces puedo usar mi código para completar la lista sin cambios. También descubrí que, como alternativa a '[XmlType]', puedo decorar la lista en la clase de Configuraciones con '[XmlArrayItem (ElementName =" WhateverNameYouLike ")]'. Puede ser útil si tengo dos listas de 'KeyValuePair', pero quiero dar a los elementos diferentes nombres en el archivo XML. ¡Gracias de nuevo! – Slauma

+0

Me complace ayudarte :) –

+6

No tiene nada que ver con el atributo 'Serializable': la serialización XML no lo necesita. La razón es que las propiedades 'Key' y' Value' son de solo lectura –

Cuestiones relacionadas