2010-02-04 96 views
9

我可以序列名單很容易:C# - 反序列化列表<String>

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

現在我需要一個像這樣的方法:

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

有沒有這樣的方法?或者我需要創建一個XML閱讀器並以這種方式加載它?


編輯:原來沒有內置SerialzeObject。我早先在我的項目中做過一個,忘記了它。當我發現它,我認爲這是建立在如果你很好奇這是我做了SerializeObject:

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

回答

18

有沒有這樣的內置方法SerializeObject但它並不難代碼一升起來。

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

和反序列化

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是內置的,但我之前寫過。 :)感謝您的反序列化方法。 – Vaccano 2010-02-04 18:02:13

+0

完美運作。 – Vaccano 2010-02-04 18:06:05

4

這是我的工作非常好

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

你只需要定義一個類型列表,並使用它來代替

序列化/反序列化擴展方法
public class StringList : List<String> { } 

哦,你不需要XmlSerializerFactory,它只是在那裏,因爲創建一個序列化器很慢,並且如果你反覆使用同一個,這會加速你的應用程序。

+0

試過這個,不能得到它的工作。 (TheEtension方法未顯示在itellisense中。) – Vaccano 2010-02-04 18:06:39

+0

@Vaccano,在嘗試使用它之前是否編譯過?你確實有一個靜態類正確嗎? – CaffGeek 2010-02-04 18:11:01

+0

我確實在一個靜態類中。 (我沒有編譯,但我添加的其他靜態方法不需要編譯工作,所以我確實認爲它是需要的)。無論哪種方式JaredPar的答案符合我的需要。我沒有投票給你,儘管你把答案放在了答案中。謝謝! – Vaccano 2010-02-04 18:48:12

1

我不確定這是否會對您有所幫助,但我已經穹頂了一些我認爲與您相似的東西。

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

這讓我對我所有的數據deserialise回到列表<>但我建議把它放在一個try - catch塊,以保證安全。事實上,現在看這個現在會讓我在「使用」塊中重寫它。

我希望這會有所幫助。

編輯:

道歉,只注意到你正在嘗試做不同的方式,但我會離開我的答案反正有。