Comenzaré con la copia de la respuesta 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();
}
}
Usé este código antes. Pero la realidad mostró que esta solución es un poco problemática. Por lo general, la mayoría de los programadores solo serializan la configuración al guardar y deserializan la configuración al cargar. Este es un escenario optimista. Una vez que la serialización falló, por alguna razón, el archivo está parcialmente escrito, el archivo XML no está completo y no es válido. En consecuencia, la deserialización XML no funciona y su aplicación puede bloquearse al inicio. Si el archivo no es enorme, sugiero primero serializar el objeto para MemoryStream
luego escribir la secuencia en el Archivo. Este caso es especialmente importante si hay alguna serialización personalizada complicada. Nunca puedes probar todos los 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());
}
}
La deserialización en el escenario del mundo real debe contar con un archivo de serialización dañado, sucede en algún momento. La función de carga proporcionada por Ben Gripka está bien.
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];
}
}
Y podría estar envuelto por algún escenario de recuperación. Es adecuado para archivos de configuración u otros archivos que se pueden eliminar en caso de problemas.
public static [ObjectType] LoadWithRecovery(string fileName)
{
try
{
return Load(fileName);
}
catch(Excetion)
{
File.Delete(fileName); //delete corrupted settings file
return GetFactorySettings();
}
}