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();
}
}
이 코드를 더 일찍 사용했습니다. 그러나 현실은이 솔루션이 약간 문제가 있음을 보여주었습니다. 일반적으로 대부분의 프로그래머는 저장시 설정을 직렬화하고로드시 설정을 직렬화 해제합니다. 이것은 낙관적 시나리오입니다. 어떤 이유로 인해 직렬화에 실패하면 파일이 부분적으로 작성되고 XML 파일이 완료되지 않아 유효하지 않습니다. 결과적으로 XML 역 직렬화가 작동하지 않고 시작시 응용 프로그램이 중단 될 수 있습니다. 파일이 크지 않으면 먼저 객체를 직렬화 MemoryStream
한 다음 스트림을 파일에 쓰도록 제안 합니다. 이 경우는 복잡한 사용자 지정 직렬화가있는 경우 특히 중요합니다. 모든 사례를 테스트 할 수는 없습니다.
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());
}
}
실제 시나리오에서 역 직렬화는 손상된 직렬화 파일로 계산해야하며, 때때로 발생합니다. Ben Gripka가 제공하는로드 기능이 좋습니다.
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];
}
}
그리고 일부 복구 시나리오로 인해 랩핑 될 수 있습니다. 설정 파일 또는 문제 발생시 삭제할 수있는 기타 파일에 적합합니다.
public static [ObjectType] LoadWithRecovery(string fileName)
{
try
{
return Load(fileName);
}
catch(Excetion)
{
File.Delete(fileName); //delete corrupted settings file
return GetFactorySettings();
}
}