Я начну с ответа на копию 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();
}
}
Я использовал этот код раньше. Но реальность показала, что это решение немного проблематично. Обычно большинство программистов просто сериализуют настройки при сохранении и десериализации настроек при загрузке. Это оптимистический сценарий. Как только сериализация завершилась неудачно, по какой-то причине файл частично написан, файл 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();
}
}