2010-02-04 35 views
9

tôi có thể serialize một danh sách thực sự dễ dàng:C# - Deserialize một danh sách <String>

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

Bây giờ tôi cần một phương pháp như thế này:

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

Có một phương pháp như vậy? Hoặc tôi sẽ cần phải tạo một trình đọc XML và tải nó theo cách đó?


EDIT: Hóa ra không có sẵn trong SerialzeObject. Tôi đã làm trước đó trong dự án của mình và quên nó đi. Khi tôi tìm thấy nó, tôi nghĩ rằng nó được xây dựng vào Trong trường hợp bạn đang tò mò đây là SerializeObject mà tôi thực hiện:.

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

Trả lời

18

Không có phương pháp dựng sẵn như SerializeObject nhưng nó không phải là quá khó khăn để mã lên.

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

Và 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

Tôi nghĩ SerialzeObject đã được tích hợp sẵn, nhưng tôi đã viết nó trước đó. :) Cảm ơn phương pháp deserialize. – Vaccano

+0

Điều đó hoạt động hoàn hảo. – Vaccano

4

Đây là những phương pháp khuyến nông serialize/deserialize của tôi mà làm việc khá tốt

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

Bạn chỉ cần xác định một kiểu cho danh sách của bạn và sử dụng nó thay vì

public class StringList : List<String> { } 

Ồ, và bạn không CẦN XmlSerializerFactory, nó chỉ có kể từ khi tạo một serializer là chậm, và nếu bạn sử dụng cùng một hơn và hơn này tăng tốc độ ứng dụng của bạn.

+0

Cố gắng này và không thể làm cho nó hoạt động. (TheE xtension Phương pháp không hiển thị trong itellisense.) – Vaccano

+0

@Vaccano, đã làm nó biên dịch trước khi cố gắng sử dụng nó? Và bạn đã có nó trong một lớp tĩnh đúng không? – CaffGeek

+0

Tôi đã có nó trong một lớp tĩnh. (Tôi đã không biên dịch, nhưng các phương thức tĩnh khác mà tôi thêm vào không cần biên dịch để làm việc, vì vậy tôi đã nghĩ rằng nó là cần thiết). Dù bằng cách nào, câu trả lời của JaredPar phù hợp với những gì tôi cần. Tôi đã bỏ phiếu cho bạn cho những nỗ lực bạn đưa vào câu trả lời mặc dù. Cảm ơn! – Vaccano

1

Tôi không chắc chắn điều này sẽ giúp bạn nhưng tôi có mái vòm cái gì đó mà tôi tin là tương tự như bạn.

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

này cho phép tôi để deserialise tất cả dữ liệu của tôi trở lại vào một danh sách <> nhưng tôi muốn khuyên đặt nó trong một thử - khối catch cho an toàn. Trong thực tế chỉ cần nhìn vào điều này bây giờ sẽ làm cho tôi viết lại điều này trong một "sử dụng" khối quá.

Tôi hy vọng điều này sẽ hữu ích.

EDIT:

Xin lỗi, chỉ nhận thấy bạn đang cố gắng để làm điều đó một cách khác nhau nhưng tôi sẽ để lại câu trả lời của tôi ở đó anyway.

Các vấn đề liên quan