我将从Ben Gripka的副本答案开始:
public void Save(string FileName)
{
using (var writer = new System.IO.StreamWriter(FileName))
{
var serializer = new XmlSerializer(this.GetType());
serializer.Serialize(writer, this);
writer.Flush();
}
}
我之前使用过此代码。但是现实表明,这种解决方案有点问题。通常,大多数程序员只是在保存时序列化设置,在加载时反序列化设置。这是一个乐观的情况。一旦序列化失败,由于某种原因,该文件将被部分写入,XML文件不完整且无效。因此,XML反序列化无法正常工作,并且您的应用程序可能会在启动时崩溃。如果文件不是很大,建议先序列化对象,MemoryStream
然后将流写入文件。如果存在一些复杂的自定义序列化,这种情况尤为重要。您永远无法测试所有情况。
public void Save(string fileName)
{
//first serialize the object to memory stream,
//in case of exception, the original file is not corrupted
using (MemoryStream ms = new MemoryStream())
{
var writer = new System.IO.StreamWriter(ms);
var serializer = new XmlSerializer(this.GetType());
serializer.Serialize(writer, this);
writer.Flush();
//if the serialization succeed, rewrite the file.
File.WriteAllBytes(fileName, ms.ToArray());
}
}
现实世界中的反序列化应与损坏的序列化文件一起计算,有时会发生。Ben Gripka提供的加载功能很好。
public static [ObjectType] Load(string fileName)
{
using (var stream = System.IO.File.OpenRead(fileName))
{
var serializer = new XmlSerializer(typeof([ObjectType]));
return serializer.Deserialize(stream) as [ObjectType];
}
}
而且它可以由一些恢复方案来包装。它适用于设置文件或其他在出现问题时可以删除的文件。
public static [ObjectType] LoadWithRecovery(string fileName)
{
try
{
return Load(fileName);
}
catch(Excetion)
{
File.Delete(fileName); //delete corrupted settings file
return GetFactorySettings();
}
}