【发布时间】:2016-03-28 14:12:33
【问题描述】:
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;
}
我正在编写一个用于备份文件的简单程序,但遇到了问题。 我应该记录任何更改,但是当我尝试序列化有关更改的单音存储信息时,我得到的只是一个空的 .xml 文件。 我应该怎么做才能序列化动态数组(List)??
【问题讨论】:
-
好的...恕我直言@Byg1 对于“一个简单的程序”,我认为您将事情复杂化了...您能否准确解释您要实现的目标或提供示例您希望看到的 XML ......
-
要用
XmlSerializer序列化你的StorageOfData类,它必须有一个公共的无参数构造函数。你的是私人的。见stackoverflow.com/questions/267724/…。除此之外,您可能还有其他问题。如果这样做,请尝试将您的代码分解为每个问题的minimal, complete examples。 -
另外,
XmlSerializer仅序列化具有公共get和set的属性。见stackoverflow.com/questions/575432/…。所以你的VersionOfFile不会正确序列化。 -
@dbc 构造函数不必是公共的,只有无参数的。序列化程序可以通过反射调用它。
-
@Rotem - 看来你是对的:dotnetfiddle.net/Li4dG4。这与here 所述不一致:当您尝试使用 XmlSerializer 类序列化没有公共默认构造函数的类时,您可能会收到 [a] System.InvalidOperationException 异常错误消息 .而在Troubleshooting Common Problems with the XmlSerializer:Test.NonSerializable 不能被序列化,因为它没有默认的公共构造函数。
标签: c# xml serialization xmlserializer