Начну с копии ответа Бена Грипки:
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());
}
}
Сценарий десериализации в реальном мире следует считать поврежденным файлом сериализации, это случается когда-нибудь. Функция загрузки, предоставленная Беном Грипкой, в порядке.
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();
}
}