2010-02-04 13 views
9

posso serializzare un elenco molto semplice:C# - deserializzare un elenco <String>

List<String> fieldsToNotCopy =new List<String> {"Iteration Path","Iteration ID"}; 
fieldsToNotCopy.SerializeObject("FieldsToNotMove.xml"); 

Ora ho bisogno di un metodo come questo:

List<String> loadedList = new List<String(); 
loadedList.DeserializeObject("FieldsToNotMove.xml"); 

Esiste un tale metodo? O avrò bisogno di creare un lettore XML e caricarlo in quel modo?


MODIFICA: risulta che non è stato creato SerialzeObject. Ne avevo fatto uno in precedenza nel mio progetto e me ne sono dimenticato. Quando l'ho trovato ho pensato che è stato costruito nel In caso siete curiosi questo è il SerializeObject che ho fatto:.

// Save an object out to the disk 
public static void SerializeObject<T>(this T toSerialize, String filename) 
{ 
    XmlSerializer xmlSerializer = new XmlSerializer(toSerialize.GetType()); 
    TextWriter textWriter = new StreamWriter(filename); 

    xmlSerializer.Serialize(textWriter, toSerialize); 
    textWriter.Close(); 
} 

risposta

18

Non esiste metodo integrato come SerializeObject ma non è terribilmente difficile da codice uno.

public void SerializeObject(this List<string> list, string fileName) { 
    var serializer = new XmlSerializer(typeof(List<string>)); 
    using (var stream = File.OpenWrite(fileName)) { 
    serializer.Serialize(stream, list); 
    } 
} 

e deserializzare

public void Deserialize(this List<string> list, string fileName) { 
    var serializer = new XmlSerializer(typeof(List<string>)); 
    using (var stream = File.OpenRead(fileName)){ 
    var other = (List<string>)(serializer.Deserialize(stream)); 
    list.Clear(); 
    list.AddRange(other); 
    } 
} 
+0

Pensavo che SerialzeObject fosse stato creato, ma l'avevo già scritto in precedenza. :) Grazie per il metodo deserialize. – Vaccano

+0

Che ha funzionato perfettamente. – Vaccano

4

Questi sono i miei metodi di estensione serializzare/deserializzare che funzionano abbastanza bene

public static class SerializationExtensions 
{ 
    public static XElement Serialize(this object source) 
    { 
     try 
     { 
      var serializer = XmlSerializerFactory.GetSerializerFor(source.GetType()); 
      var xdoc = new XDocument(); 
      using (var writer = xdoc.CreateWriter()) 
      { 
       serializer.Serialize(writer, source, new XmlSerializerNamespaces(new[] { new XmlQualifiedName("", "") })); 
      } 

      return (xdoc.Document != null) ? xdoc.Document.Root : new XElement("Error", "Document Missing"); 
     } 
     catch (Exception x) 
     { 
      return new XElement("Error", x.ToString()); 
     } 
    } 

    public static T Deserialize<T>(this XElement source) where T : class 
    { 
     try 
     { 
      var serializer = XmlSerializerFactory.GetSerializerFor(typeof(T)); 

      return (T)serializer.Deserialize(source.CreateReader()); 
     } 
     catch //(Exception x) 
     { 
      return null; 
     } 
    } 
} 

public static class XmlSerializerFactory 
{ 
    private static Dictionary<Type, XmlSerializer> serializers = new Dictionary<Type, XmlSerializer>(); 

    public static XmlSerializer GetSerializerFor(Type typeOfT) 
    { 
     if (!serializers.ContainsKey(typeOfT)) 
     { 
      System.Diagnostics.Debug.WriteLine(string.Format("XmlSerializerFactory.GetSerializerFor(typeof({0}));", typeOfT)); 

      var newSerializer = new XmlSerializer(typeOfT); 
      serializers.Add(typeOfT, newSerializer); 
     } 

     return serializers[typeOfT]; 
    } 
} 

Hai solo bisogno di definire un tipo per la vostra lista e utilizzarlo al posto

public class StringList : List<String> { } 

Oh, e non è NECESSARIO XmlSerializerFactory, è solo lì da quando la creazione di un serializzatore è lenta, e se si utilizza la stessa più volte si velocizza la tua app.

+0

Ho provato questo e non ho potuto farlo funzionare. (I metodi di xtension non sono stati visualizzati in itellisense.) – Vaccano

+0

@Vaccano, è stato compilato prima di tentare di usarlo? E l'hai fatto in una classe statica corretta? – CaffGeek

+0

L'ho avuto in una classe statica. (Non ho compilato, ma altri metodi statici che aggiungo non hanno bisogno di una compilazione per funzionare, quindi ho pensato che fosse necessario). In ogni caso la risposta di JaredPar si adatta a ciò di cui ho bisogno. Ho votato per lo sforzo che hai inserito nella risposta. Grazie! – Vaccano

1

Non sono sicuro se questo ti aiuterà ma ho una cupola che credo sia simile a te.

//A list that holds my data 
private List<Location> locationCollection = new List<Location>(); 


public bool Load() 
{ 
      //For debug purposes 
      Console.WriteLine("Loading Data"); 

      XmlSerializer serializer = new XmlSerializer(typeof(List<Location>)); 
      FileStream fs = new FileStream("CurrencyData.xml", FileMode.Open); 

      locationCollection = (List<Location>)serializer.Deserialize(fs); 

      fs.Close(); 

      Console.WriteLine("Data Loaded"); 
      return true; 
} 

Questo mi permette di deserialise tutti i miei dati in un elenco <> ma vorrei consigliare di metterlo in una prova - blocco catch per la sicurezza. In effetti solo guardarlo ora mi farà riscrivere anche in un blocco "using".

Spero che questo aiuti.

EDIT:

Scuse, appena notato che si sta cercando di fare in un altro modo, ma lascio la mia risposta comunque.

Problemi correlati