Ben Gripka'nın kopya cevabı ile başlayacağım:
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();
}
}
Bu kodu daha önce kullandım. Ancak gerçeklik, bu çözümün biraz problemli olduğunu gösterdi. Genellikle programcıların çoğu, ayarları kaydetme ve serileştirme ayarlarını kaldırma sırasında serileştirir. Bu iyimser bir senaryodur. Serileştirme başarısız olduğunda, bazı nedenlerden dolayı, dosya kısmen yazılmıştır, XML dosyası tamamlanmamıştır ve geçersizdir. Sonuç olarak XML serileştirmesi çalışmaz ve uygulamanız başlangıçta kilitlenebilir. Dosya çok büyük değilse, önce dosyayı Dosyaya MemoryStream
yazmak için önce nesneyi serileştirmenizi öneririm . Bazı karmaşık özel serileştirmeler varsa bu durum özellikle önemlidir. Hiçbir zaman tüm vakaları test edemezsiniz.
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());
}
}
Gerçek dünya senaryosundaki serileştirme, bozuk serileştirme dosyasıyla sayılmalıdır, bazen gerçekleşir. Ben Gripka tarafından sağlanan yük fonksiyonu gayet iyi.
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];
}
}
Ve bazı kurtarma senaryosu ile tamamlanabilir. Sorun olması durumunda silinebilen ayar dosyaları veya diğer dosyalar için uygundur.
public static [ObjectType] LoadWithRecovery(string fileName)
{
try
{
return Load(fileName);
}
catch(Excetion)
{
File.Delete(fileName); //delete corrupted settings file
return GetFactorySettings();
}
}