2010-04-17 13 views
25

Ho un elenco di coppie chiave/valore che desidero memorizzare e recuperare da un file XML. Quindi questa attività è simile a quella descritta in here. Sto cercando di seguire il consiglio nella risposta contrassegnata (utilizzando un KeyValuePair e un XmlSerializer) ma non riesco a farlo funzionare.Serializzazione di un elenco di coppie chiave/valore in XML

Quello che ho finora è una classe "Impostazioni" ...

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

... un'istanza di questa classe ...

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

... e il seguente codice scrivere che ad esempio un file XML:

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

Il file risultante è:

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

Quindi, nessuna chiave o valore delle coppie nella mia lista vengono memorizzate anche se il numero di elementi è corretto. Ovviamente sto facendo qualcosa di fondamentalmente sbagliato. Le mie domande sono:

  • Come posso memorizzare le coppie chiave/valore della lista nel file?
  • Come posso cambiare il nome generato predefinito "KeyValuePairOfStringInt32" degli elementi nell'elenco con un altro nome come "listElement" che mi piacerebbe avere?

risposta

48

KeyValuePair non è serializzabile, perché ha proprietà di sola lettura. Here è più informazioni (grazie a Thomas Levesque). Per modificare il nome generato utilizzare l'attributo [XmlType].

definire il proprio così:

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

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

Grande, funziona, grazie! Ho aggiunto un costruttore alla tua struct: 'public KeyValuePair (K k, V v): this() {Key = k; Valore = v; } ', quindi posso usare il mio codice per riempire l'elenco senza modifiche. Inoltre ho capito che come alternativa a '[XmlType]' Posso decorare la lista nella classe Settings con '[XmlArrayItem (ElementName =" WhateverNameYouLike ")]'. Può essere utile se avessi due elenchi di 'KeyValuePair', ma voglio dare agli elementi nomi diversi nel file XML. Grazie ancora! – Slauma

+0

Felice di aiutarti :) –

+6

Non ha nulla a che fare con l'attributo 'Serializable': la serializzazione XML non ne ha bisogno. Il motivo è che le proprietà 'Key' e' Value' sono di sola lettura –

Problemi correlati