Ich werde mit der Antwort von Ben Gripka beginnen:
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();
}
}
Ich habe diesen Code früher verwendet. Die Realität hat jedoch gezeigt, dass diese Lösung etwas problematisch ist. Normalerweise serialisieren die meisten Programmierer die Einstellungen beim Speichern nur und deserialisieren die Einstellungen beim Laden. Dies ist ein optimistisches Szenario. Sobald die Serialisierung fehlgeschlagen ist, wird die Datei aus irgendeinem Grund teilweise geschrieben, die XML-Datei ist nicht vollständig und ungültig. Infolgedessen funktioniert die XML-Deserialisierung nicht und Ihre Anwendung kann beim Start abstürzen. Wenn die Datei nicht riesig ist, schlage ich vor, zuerst das Objekt zu serialisierenMemoryStream
dann den Stream in die Datei schreiben. Dieser Fall ist besonders wichtig, wenn eine komplizierte benutzerdefinierte Serialisierung vorliegt. Sie können niemals alle Fälle testen.
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());
}
}
Die Deserialisierung im realen Szenario sollte mit einer beschädigten Serialisierungsdatei zählen, es kommt irgendwann vor. Die Ladefunktion von Ben Gripka ist in Ordnung.
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];
}
}
Und es könnte durch ein Wiederherstellungsszenario verpackt werden. Es eignet sich für Einstellungsdateien oder andere Dateien, die bei Problemen gelöscht werden können.
public static [ObjectType] LoadWithRecovery(string fileName)
{
try
{
return Load(fileName);
}
catch(Excetion)
{
File.Delete(fileName); //delete corrupted settings file
return GetFactorySettings();
}
}