2010-08-13 2 views
4

시간이 지남에 따라 특정 버전이 변경되는 클래스가 있습니다. 이 클래스 내부의 데이터는 응용 프로그램 시작의 일부로 직렬화되고 직렬화 해제됩니다. 문제는 내가 속성을 더 추가하여 클래스를 업데이트 한 다음 응용 프로그램을 시작하면 이전 데이터가 제대로로드되지 않는다는 것입니다.
내가 원하는 것은 deserialization 단계를 덮어 쓰는 것입니다. xml에서 객체를 수동으로 재구성하는 것을 신경 쓰지 않습니다. 버전 번호가 저장되어 있으며 재귀 적으로 객체의 버전을 업데이트하는 데 사용할 수 있습니다.C에서 deserialization을 재정의하는 방법

구현할 수있는 인터페이스가 있습니까, 아니면 어딘가 설정할 수있는 속성이 있습니까?

내가 원하는 것을 할 수있는 방법이 없다면 대안이 있습니까? 로드중인 xml 버전에 존재하지 않을 수있는 속성에 대한 기본값을 지정하는 것과 같은 속성입니다.

답변

2

일반적으로 버전에 대한 호환성 문제가 발생할 수 있습니다 새로 추가 된 회원들에게 OptionalField 속성을 사용할 수 있습니다. 직렬화 중에 멤버가 serialize되지 않은 경우이 예외를 throw하는 대신 멤버 값이 null로 유지됩니다.

또한 IDeserializationCallback.OnDeserialization 인터페이스를 살펴보고 비 직렬화를 사용자 정의 할 수 있습니다.

1

특히 xml-serialization 인 경우 IXmlSerializable 인터페이스를 구현해야합니다. 이진 직렬화의 경우 OptionalField 특성을 사용하여 새 멤버를 태그 할 수 있습니다.

여기에서 자세한 내용을보실 수 있습니다 : http://msdn.microsoft.com/en-us/library/ms229752(VS.80).aspx

0

ISerializable 인터페이스를 구현하고 SerializationInfoStreamingContext 개체를 사용하여 serialization/deserialization 프로세스의 미세 제어를 얻는 생성자를 제공 할 수 있습니다. 예를 들어

:

[Serializable] 
public struct MyStruct: ISerializable 
{ 
    private readonly int _x; 
    private readonly int _y; 

    // normal constructor 
    public MyStruct(int x, int y) : this() 
    { 
     _x = x; 
     _y = y; 
    } 

    // this constructor is used for deserialization 
    public MyStruct(SerializationInfo info, StreamingContext text) : this() 
    { 
     _x = info.GetInt32("X"); 
     _y = info.GetInt32("Y"); 
    } 

    public int X { get { return _x; } } 
    public int Y { get { return _y; } } 

    // this method is called during serialization 
    [SecurityPermission(SecurityAction.Demand, SerializationFormatter = true)] 
    public void GetObjectData(SerializationInfo info, StreamingContext context) 
    { 
     info.AddValue("X", X); 
     info.AddValue("Z", Y); 
    } 
}