Tôi sẽ bắt đầu với câu trả lời sao chép của 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();
}
}
Tôi đã sử dụng mã này trước đó. Nhưng thực tế cho thấy giải pháp này có một chút vấn đề. Thông thường hầu hết các lập trình viên chỉ cần tuần tự hóa cài đặt khi lưu và giải nén các cài đặt khi tải. Đây là một kịch bản lạc quan. Khi việc tuần tự hóa thất bại, vì một số lý do, tệp được ghi một phần, tệp XML không hoàn chỉnh và không hợp lệ. Do đó, quá trình khử lưu trữ XML không hoạt động và ứng dụng của bạn có thể bị sập khi bắt đầu. Nếu tệp không lớn, tôi đề nghị đối tượng tuần tự hóa đầu tiên MemoryStream
sau đó ghi luồng vào Tệp. Trường hợp này đặc biệt quan trọng nếu có một số tuần tự tùy chỉnh phức tạp. Bạn không bao giờ có thể kiểm tra tất cả các trường hợp.
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());
}
}
Việc khử lưu huỳnh trong kịch bản thế giới thực sẽ được tính với tệp tuần tự bị hỏng, đôi khi nó xảy ra. Chức năng tải được cung cấp bởi Ben Gripka là tốt.
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];
}
}
Và nó có thể được bao bọc bởi một số kịch bản phục hồi. Nó phù hợp cho các tệp cài đặt hoặc các tệp khác có thể bị xóa trong trường hợp có vấn đề.
public static [ObjectType] LoadWithRecovery(string fileName)
{
try
{
return Load(fileName);
}
catch(Excetion)
{
File.Delete(fileName); //delete corrupted settings file
return GetFactorySettings();
}
}