2013-07-07 96 views
2

鑑於某些對象名單:序列化,並在Windows Phone的反序列化對象的列表8應用

List<Car> carlist = new List<Car>(); 

我如何可以序列名單爲XML文件或二進制文件和反序列化回來?

我有這個到目前爲止,但它不起作用。

//IsolatedStorageFile isFile = IsolatedStorageFile.GetUserStoreForApplication(); 
//IsolatedStorageFileStream ifs = new IsolatedStorageFileStream("myxml.xml", FileMode.Create,isFile); 
//DataContractSerializer ser = new DataContractSerializer(); 
//XmlWriter writer = XmlWriter.Create(ifs); 
//ser.WriteObject(writer, carlist); 
+0

如果它不起作用,你需要說明它是如何不適合你的。你在期待什麼?實際發生了什麼?等等...... –

回答

10

我使用這些方法來從/ XML文件到IsolatedStorage保存和加載:

public static class IsolatedStorageOperations 
{ 
    public static async Task Save<T>(this T obj, string file) 
    { 
     await Task.Run(() => 
      { 
       IsolatedStorageFile storage = IsolatedStorageFile.GetUserStoreForApplication(); 
       IsolatedStorageFileStream stream = null; 

       try 
       { 
        stream = storage.CreateFile(file); 
        XmlSerializer serializer = new XmlSerializer(typeof (T)); 
        serializer.Serialize(stream, obj); 
       } 
       catch (Exception) 
       { 
       } 
       finally 
       { 
        if (stream != null) 
        { 
         stream.Close(); 
         stream.Dispose(); 
        } 
       } 
      }); 
    } 

    public static async Task<T> Load<T>(string file) 
    { 

     IsolatedStorageFile storage = IsolatedStorageFile.GetUserStoreForApplication(); 
     T obj = Activator.CreateInstance<T>(); 

     if (storage.FileExists(file)) 
     { 
      IsolatedStorageFileStream stream = null; 
      try 
      { 
       stream = storage.OpenFile(file, FileMode.Open); 
       XmlSerializer serializer = new XmlSerializer(typeof (T)); 

       obj = (T) serializer.Deserialize(stream); 
      } 
      catch (Exception) 
      { 
      } 
      finally 
      { 
       if (stream != null) 
       { 
        stream.Close(); 
        stream.Dispose(); 
       } 
      } 
      return obj; 
     } 
     await obj.Save(file); 
     return obj; 
    } 
} 

您可以自定義()錯誤在catch處理。

另外,你可以根據你的需要調整Load方法,在我的情況下,我試圖從一個文件中加載,如果不存在,它會創建一個默認的,並將默認的序列化對象到構造函數。

UPDATE:

比方說,你有小汽車的名單:

List< Car > carlist= new List< Car >();

要保存,你可以稱他們爲await carlist.Save("myXML.xml");,因爲它是一個異步Taskasync) 。

加載,var MyCars = await IsolatedStorageOperations.Load< List< Car> >("myXML.xml").(我想,我沒有用它這樣的,作爲一個List那麼遠,

+0

如何加載列表? – user1713352

+0

我已經更新了我的答案。祝你好運。 – VasileF

0

DataContactJsonSerializer性能比XmlSerializer的好。它創建更小的文件,並處理內部性能好名單。

+0

能否請你提供一些例子或參考? – waghekapil

+1

@ waghekapil:基於我自己的經驗。你可以嘗試序列化對象具有List的內部屬性,並且它將被XmlSerializer跳過。還有關於大小 - 一般來說,XML具有比JSON更大的結構。 – Illidan

+0

謝謝!我已經通過DataContactJsonSerializer完成了:) – waghekapil