まず、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();
}
}