Je vais commencer par la copie de la réponse 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();
}
}
J'ai utilisé ce code plus tôt. Mais la réalité a montré que cette solution est un peu problématique. Habituellement, la plupart des programmeurs se contentent de sérialiser les paramètres lors de l'enregistrement et de désérialiser les paramètres lors du chargement. Il s'agit d'un scénario optimiste. Une fois que la sérialisation a échoué, pour une raison quelconque, le fichier est partiellement écrit, le fichier XML n'est pas complet et il n'est pas valide. Par conséquent, la désérialisation XML ne fonctionne pas et votre application peut se bloquer au démarrage. Si le fichier n'est pas énorme, je suggère d'abord de sérialiser l'objet pour MemoryStream
ensuite écrire le flux dans le fichier. Ce cas est particulièrement important s'il existe une sérialisation personnalisée compliquée. Vous ne pouvez jamais tester tous les cas.
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 désérialisation dans le scénario du monde réel devrait compter avec un fichier de sérialisation corrompu, cela arrive parfois. La fonction de charge fournie par Ben Gripka est très 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];
}
}
Et il pourrait être enveloppé par un scénario de récupération. Il convient aux fichiers de paramètres ou autres fichiers qui peuvent être supprimés en cas de problème.
public static [ObjectType] LoadWithRecovery(string fileName)
{
try
{
return Load(fileName);
}
catch(Excetion)
{
File.Delete(fileName); //delete corrupted settings file
return GetFactorySettings();
}
}