Zacznę od kopii odpowiedzi Bena Gripki:
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();
}
}
Użyłem tego kodu wcześniej. Rzeczywistość pokazała jednak, że to rozwiązanie jest nieco problematyczne. Zwykle większość programistów po prostu serializuje ustawienia zapisywania i deserializuje ustawienia przy ładowaniu. To optymistyczny scenariusz. Gdy serializacja się nie powiodła, z jakiegoś powodu plik jest częściowo zapisywany, plik XML nie jest kompletny i jest nieprawidłowy. W rezultacie deserializacja XML nie działa, a aplikacja może ulec awarii podczas uruchamiania. Jeśli plik nie jest duży, sugeruję najpierw serializować obiekt, MemoryStream
a następnie zapisać strumień do pliku. Ten przypadek jest szczególnie ważny, jeśli występuje skomplikowana niestandardowa serializacja. Nigdy nie możesz przetestować wszystkich przypadków.
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());
}
}
Scenariusz deserializacji w świecie rzeczywistym powinien się liczyć z uszkodzonym plikiem serializacji, zdarza się to kiedyś. Funkcja ładowania zapewniona przez Ben Gripka jest w porządku.
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];
}
}
I może być zawarty w scenariuszu odzyskiwania. Nadaje się do plików ustawień lub innych plików, które można usunąć w razie problemów.
public static [ObjectType] LoadWithRecovery(string fileName)
{
try
{
return Load(fileName);
}
catch(Excetion)
{
File.Delete(fileName); //delete corrupted settings file
return GetFactorySettings();
}
}