2010-02-04 45 views
9

Puedo serializar una lista muy fácil:C# - deserializar una lista <String>

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

Ahora necesito un método como este:

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

¿Hay un procedimiento de este tipo? ¿O voy a necesitar crear un lector de XML y cargarlo de esa manera?


EDITAR: Resulta que no existe ningún SerialzeObject incorporado. Hice uno antes en mi proyecto y lo olvidé. Cuando lo encontré, pensé que fue construido en En caso de que usted es curioso que este es el SerializeObject que hice:.

// 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(); 
} 

Respuesta

18

no existe un método tal incorporado como SerializeObject pero no es terriblemente difícil de codificar una.

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

y serializar

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

Pensé que SerialzeObject estaba integrado, pero lo había escrito antes. :) Gracias por el método deserialize. – Vaccano

+0

Eso funcionó perfectamente. – Vaccano

4

Estos son mis métodos de extensión serializar/deserializar que funcionan bastante bien

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]; 
    } 
} 

sólo tiene que definir un tipo para su lista y usarlo en lugar

public class StringList : List<String> { } 

Ah, y usted NO NECESITA la XmlSerializerFactory, solo está ahí porque la creación de un serializador es lenta, y si utiliza la misma repetidamente, esto acelera su aplicación.

+0

Intenté este y no pude hacerlo funcionar. (TheE xtension Methods no apareció en itellisense.) – Vaccano

+0

@Vaccano, ¿compiló antes de intentar usarlo? ¿Y lo tienes en una clase estática correcta? – CaffGeek

+0

Lo tenía en una clase estática. (No compilé, pero otros métodos estáticos que agrego no necesitan una compilación para trabajar, así que pensé que era necesario). De cualquier manera, la respuesta de JaredPar se ajusta a lo que necesito. Sin embargo, te voté por el esfuerzo que pusiste en la respuesta. ¡Gracias! – Vaccano

1

No estoy seguro de si esto te ayudará pero tengo algo que creo que es similar a ti.

//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; 
} 

Esto me permite deserialise todos mis datos de nuevo en una lista <> pero te aconsejo ponerlo en un intento - bloque catch para la seguridad. De hecho, solo mirar esto ahora me va a hacer reescribir esto también en un bloque "usar".

Espero que esto ayude.

EDIT:

Disculpas, acabo de dar cuenta que estamos tratando de hacerlo de una manera diferente, pero voy a dejar mi respuesta allí de todos modos.

Cuestiones relacionadas