2016-03-28 49 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文件是否存在,并添加新的文件之前备份它,等