Saya akan mulai dengan jawaban salinan dari 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();
}
}
Saya menggunakan kode ini sebelumnya. Tetapi kenyataan menunjukkan bahwa solusi ini agak bermasalah. Biasanya sebagian besar programmer hanya membuat pengaturan serial pada save dan deserialize pada load. Ini adalah skenario optimis. Setelah serialisasi gagal, karena beberapa alasan, file sebagian ditulis, file XML tidak lengkap dan tidak valid. Karena itu deserialisasi XML tidak berfungsi dan aplikasi Anda mungkin macet saat mulai. Jika file tidak besar, saya sarankan objek bersambung terlebih dahulu untuk MemoryStream
kemudian menulis aliran ke File. Kasus ini sangat penting jika ada beberapa serialisasi kustom yang rumit. Anda tidak akan pernah bisa menguji semua kasus.
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());
}
}
Deserialisasi dalam skenario dunia nyata harus dihitung dengan file serialisasi yang rusak, itu terjadi kapan-kapan. Fungsi pemuatan yang disediakan oleh Ben Gripka baik-baik saja.
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];
}
}
Dan itu bisa dibungkus dengan beberapa skenario pemulihan. Sangat cocok untuk file pengaturan atau file lain yang dapat dihapus jika ada masalah.
public static [ObjectType] LoadWithRecovery(string fileName)
{
try
{
return Load(fileName);
}
catch(Excetion)
{
File.Delete(fileName); //delete corrupted settings file
return GetFactorySettings();
}
}