의 고유 한 메서드를 사용하여 버전 관리를 구현하면 ISerializable
에서 상속하여 사용자 고유의 serializer를 구현하고 예외를 throw 할 수 있습니다.
public bool Deserialize(string sFileName) {
bool bSuccessful = false;
//
if (!System.IO.File.Exists(sFileName)) return false;
fuBar = new MyFooBar();
//
try {
using (FileStream fStream = new FileStream(sFileName, FileMode.Open)) {
try {
BinaryFormatter bf = new BinaryFormatter();
fuBar = (MyFooBar)bf.Deserialize(fStream);
bSuccessful = true;
} catch (System.Runtime.Serialization.SerializationException sEx) {
System.Diagnostics.Debug.WriteLine(string.Format("SERIALIZATION EXCEPTION> DETAILS ARE {0}", sEx.ToString()));
bSuccessful = false;
}
}
} catch (System.IO.IOException ioEx) {
System.Diagnostics.Debug.WriteLine(string.Format("IO EXCEPTION> DETAILS ARE {0}", ioEx.ToString()));
bSuccessful = false;
}
return (bSuccessful == true);
}
아래와 같이 데이터가 2.0 이상에서이 작업을 수행 할 수있는 더 깔끔한 방법이 여기에 예를 들어
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
public class MyFooBar : ISerializable{
private float _fVersion = 1.0;
public MyFooBar(SerializationInfo info, StreamingContext context) {
this._fVersion = info.GetSingle("FooBarVersionID");
if (this._fVersion == 1.0F) bOk = this.HandleVersionOnePtZero(info, context);
if (!bOk) throw new SerializationException(string.Format("MyFooBar: Could not handle this version {0}.", this._fVersion.ToString()));
}
[System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.LinkDemand, Flags = System.Security.Permissions.SecurityPermissionFlag.SerializationFormatter)]
public void GetObjectData(SerializationInfo info, StreamingContext context) {
info.AddValue("FooBarVersionID", this._fVersion);
if (this._fVersion == 1.0F) {
// Bool's...
info.AddValue("FooBarBool", FooBarBool);
// etc... for Version 1.0
}
if (this._fVersion == 1.1F){
// etc... for Version 1.0
}
}
}
그리고/역 직렬화를 직렬화 할 때이 상황에서 MyFooBar를 사용의 ... 직렬화 쪽으로 와드,하지만 나는이 방법을 선호한다.