Почну з відповіді про копію Бена Гріпки:
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();
}
}