2010-02-04 7 views
9

Listesini Deserialize: böyle bir yöntemC# - Bir liste gerçekten kolay serileştirebilirsiniz <String>

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

var mı:

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

Şimdi böyle bir yöntem gerekir? Yoksa bir XML okuyucu oluşturup onu bu şekilde yüklemem gerekecek mi?


DÜZENLEME: SerialzeObject öğesinde yerleşik olmadığını gösterir. Projemde bir tane daha yapmıştım ve unutmuştum. Onu bulduğunda bunu inşa edildi düşünce sen merak durumda bu yaptığım SerializeObject geçerli:.

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

cevap

18

SerializeObject diye bir yerleşik yöntem yoktur ama kod tek up korkunç zor değil.

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

Ve Deserialize

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

SerialzeObject'in yerleşik olduğunu sanmıştım, ancak daha önce yazmıştım. :) Deserialize yöntemi için teşekkürler. – Vaccano

+0

Mükemmel çalıştı. – Vaccano

4

Bu

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

Sadece kendi listesi için bir türünü tanımlamak ve bunun yerine

kullanmaya gerek oldukça iyi iş benim serialize/serisi kaldırılmaya uzantısı yöntemlerdir
public class StringList : List<String> { } 

Oh, ve XmlSerializerFactory İHTİYACINIZ, sadece bir seri hale getirici oluşturmak yavaş olduğundan, ve bu aynı uygulamayı kullanıyorsanız ve bu uygulamayı hızlandırır.

+0

Bunu denedim ve işe yaramadım. (TheE xtension Methods, itellisense'de görünmedi.) – Vaccano

+0

@Vaccano, kullanmayı denemeden önce derlediler mi? Ve sen bunu sabit bir sınıfta mı yaptın? – CaffGeek

+0

Statik bir sınıfa sahip oldum. (Derlemedim, ancak eklediğim diğer statik yöntemler, çalışmak için derlemeye gerek yok, bu yüzden gerekli olduğunu düşündüm). JaredPar'ın cevabı, ihtiyacım olan şeylere uyuyor. Yine de cevaba koyduğun çaba için sana oy verdim. Teşekkürler! – Vaccano

1

Bunun size yardım edip etmeyeceğinden emin değilim ama sana benzeyeceğine inandığım bir şey var.

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

Bu beni List < geri tüm verileri deserialise sağlar> ama bir denemede koyarak öneriyorum - catch bloğu güvenliği için. Aslında şuna baktığımda, bunu bir "kullanma" bloğunda da tekrar yazmamı sağlayacağım.

Umarım bu yardımcı olur.

DÜZENLEME:

Özür dileriz, bunu farklı bir şekilde yapmaya çalışıyoruz ama yine de cevabımı bırakacağım sadece ettim.