2016-03-28 63 views
0
public class StorageOfData 
{ 
    public static StorageOfData instance; 

    private StorageOfData() 
    { } 

    public static StorageOfData getInstance() 
    { 
     if (instance == null) 
      instance = new StorageOfData(); 
     return instance; 
    } 

    private List<List<VersionOfFile>> list = new List<List<VersionOfFile>>(); 

    public List<VersionOfFile> this[int index] 
    { 
     get 
     { 
      return list[index]; 
     } 
    } 

    public void RestoreDataFromFile(String path) 
    { 
     StorageOfData DATA; 
     XmlSerializer mySerializer = new XmlSerializer(typeof(StorageOfData)); 
     FileStream myFileStream = new FileStream(path + @"BAK\" + "history.xml", FileMode.Open); 
     DATA = (StorageOfData)mySerializer.Deserialize(myFileStream); 
    } 

    public void SaveDataToFile(String path) 
    { 
     StorageOfData DATA = StorageOfData.getInstance(); 
     XmlSerializer mySerializer = new XmlSerializer(typeof(StorageOfData)); 
     StreamWriter myWriter = new StreamWriter(path + @"BAK\" + "history.xml"); 
     mySerializer.Serialize(myWriter, DATA); 
     myWriter.Close(); 
    } 

    public void AddNewEntryIfRenamed(string filename, string real_filename, DateTime date, bool isDeleted) 
    { 
     for (int i = 0; i < list.Count; i++) 
     { 

      if (list[i][list[i].Count - 1].Filename == filename) 
      { 
       list[i].Add(new VersionOfFile(filename, real_filename, date, isDeleted)); 
       return; 
      } 
     } 
     list.Add(new List<VersionOfFile>()); 
     list[list.Count - 1].Add(new VersionOfFile(filename, real_filename, date, isDeleted)); 
    } 


    public void AddNewEntryIfCopyExists(string filename, string real_filename, DateTime date, bool isDeleted) 
    { 
     for (int i = 0; i < list.Count; i++) 
     { 

      if (list[i][list[i].Count - 1].Filename == filename) 
      { 
       list[i].Add(new VersionOfFile(filename, real_filename, date, isDeleted)); 
       return; 
      } 
     } 
     list.Add(new List<VersionOfFile>()); 
     list[list.Count - 1].Add(new VersionOfFile(filename, real_filename, date, isDeleted)); 
    } 

    public void AddNewEntry(string filename, DateTime date, bool isDeleted) 
    { 
     for (int i = 0; i < list.Count; i++) 
     { 

      if (list[i][list[i].Count - 1].Filename == filename) 
      { 
       list[i].Add(new VersionOfFile(filename, date, isDeleted)); 
       return; 
      } 
     } 
     list.Add(new List<VersionOfFile>()); 
     list[list.Count - 1].Add(new VersionOfFile(filename, date, isDeleted)); 
    } 

} 

internal struct VersionOfFile 
{ 
    private string filename; 
    private string real_filename; 
    private DateTime date; 
    private bool isDeleted; 

    public string Filename 
    { 
     get 
     { 
      return filename; 
     } 
    } 

    public string Real_filename 
    { 
     get 
     { 
      return real_filename; 
     } 
    } 

    public DateTime Date 
    { 
     get 
     { 
      return date; 
     } 
    } 

    public bool IsDeleted 
    { 
     get 
     { 
      return isDeleted; 
     } 
    } 

    public VersionOfFile(string filename, string real_filename, DateTime date, bool isDeleted) 
    { 
     this.filename = filename; 
     this.real_filename = real_filename; 
     this.date = date; 
     this.isDeleted = isDeleted; 
    } 

    public VersionOfFile(string filename, DateTime date, bool isDeleted) 
    { 
     this.filename = filename; 
     this.date = date; 
     this.isDeleted = isDeleted; 
     this.real_filename = String.Empty; 
    } 

我正在寫一個簡單的程序來備份我的文件,但我遇到了問題。 我應該記錄任何更改,但是當我試圖序列化有關更改信息的singletone存儲信息時,我只會得到一個空的.xml文件。 我應該怎麼做seriallise dynamaic數組(列表<>)?爲什麼XML序列化不起作用

+1

OK ......與所有應有的尊重@ Byg1爲'一個簡單的程序'我想喲你是否過於複雜的事情......你能否解釋你正在試圖達到的目標,或提供你期望看到的XML樣本...... – Monty

+1

要用'XmlSerializer'序列化你的'StorageOfData'類,它必須有一個公共無參數的構造函數。你的私人。請參閱http://stackoverflow.com/questions/267724/why-xml-serializable-class-need-a-parameterless-constructor。除此之外,您可能還有其他問題。如果你這樣做,試着把你的代碼分解成每個問題的[最小的,完整的例子](http://stackoverflow.com/help/mcve)。 – dbc

+1

另外,'XmlSerializer'只能使用public'get'和'set'序列化屬性。請參閱https://stackoverflow.com/questions/575432/why-isnt-my-public-property-serialized-by-the-xmlserializer。所以你的'VersionOfFile'將不能正確序列化。 – dbc

回答

0

另外,如本視頻(https://www.youtube.com/watch?v=UvEF7UPh1Qg)中所述,一種更簡單的方法(在我看來是這樣做的)是創建一個類,在該類中指定xml文件的元素和屬性,然後只填充它們並通過代碼給他們值。

0

要序列化您的類,您必須將數據的公共讀/寫屬性序列化。

只需添加

public List<List<VersionOfFile>> List 
    { 
     get { return list; } 
     set { list = value; } 
    } 

要StorageOfData類並添加二傳手到VersionOfFile結構屬性。

PS:

您的代碼沒有針對您的需求進行優化。儘量保證你的單身人士課程Thread safe Singleton。 出於性能方面的問題,您可以使用字典<串名單< OfFileVersion >>」和[XmlAttribute]標記添加到結構的屬性,以減小文件大小,相反的

<VersionOfFile> 
    <Filename>test</Filename> 
    </VersionOfFile> 

你會得到

<VersionOfFile Filename="test"/> 

添加的try/catch陣營,測試是否返回文件夾中,使用System.IO.Path.Combine添加路徑,測試是否History.xml文件是否存在,並添加新的文件之前備份它,等