Começarei com a resposta de cópia de 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();
}
}
Eu usei esse código anteriormente. Mas a realidade mostrou que esta solução é um pouco problemática. Normalmente, a maioria dos programadores apenas serializa as configurações em salvar e desserializa as configurações em carga. Este é um cenário otimista. Depois que a serialização falhou, por algum motivo, o arquivo é parcialmente gravado, o arquivo XML não está completo e é inválido. Consequentemente, a desserialização de XML não funciona e seu aplicativo pode falhar no início. Se o arquivo não for grande, sugiro primeiro serializar o objeto para MemoryStream
gravar o fluxo no arquivo. Este caso é especialmente importante se houver alguma serialização personalizada complicada. Você nunca pode testar todos os casos.
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());
}
}
A desserialização no cenário do mundo real deve contar com o arquivo de serialização corrompido, isso acontece em algum momento. A função de carga fornecida por Ben Gripka está correta.
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];
}
}
E pode ser envolvido por algum cenário de recuperação. É adequado para arquivos de configurações ou outros arquivos que podem ser excluídos em caso de problemas.
public static [ObjectType] LoadWithRecovery(string fileName)
{
try
{
return Load(fileName);
}
catch(Excetion)
{
File.Delete(fileName); //delete corrupted settings file
return GetFactorySettings();
}
}