Inizierò con la copia della risposta di 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();
}
}
Ho usato questo codice prima. Ma la realtà ha dimostrato che questa soluzione è un po 'problematica. Di solito la maggior parte dei programmatori semplicemente serializza le impostazioni sul salvataggio e deserializza le impostazioni sul caricamento. Questo è uno scenario ottimistico. Una volta che la serializzazione non è riuscita, per qualche motivo, il file è stato parzialmente scritto, il file XML non è completo e non è valido. Di conseguenza, la deserializzazione XML non funziona e l'applicazione potrebbe bloccarsi all'avvio. Se il file non è enorme, suggerisco prima di serializzare l'oggetto per MemoryStream
scrivere il flusso nel file. Questo caso è particolarmente importante in caso di complicata serializzazione personalizzata. Non puoi mai testare tutti i casi.
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 deserializzazione nello scenario del mondo reale dovrebbe contare con un file di serializzazione corrotto, succede qualche volta. La funzione di caricamento fornita da Ben Gripka va bene.
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 potrebbe essere avvolto da alcuni scenari di recupero. È adatto per file di impostazioni o altri file che possono essere eliminati in caso di problemi.
public static [ObjectType] LoadWithRecovery(string fileName)
{
try
{
return Load(fileName);
}
catch(Excetion)
{
File.Delete(fileName); //delete corrupted settings file
return GetFactorySettings();
}
}