2016-11-22 1 views
1

OnDeserializing 속성에 대한 질문이 있습니다. 나는 수업이 있습니다deserialize하는 동안 객체는 어떻게됩니까?

[Serializable] 
public class Test 
{ 
    int tmp = 10; 

    [OnDeserializing] 
    internal void OnDeserializingMethod(StreamingContext context) 
    { 
     tmp -= 3; 
     Console.WriteLine("{0}", tmp); 
    } 
} 

직렬화가 완벽하게 잘 작동하지만, OnDeserializationMethod 인쇄의 코드를 "-3".

그 이유는 누구에게 말해 줄 수 있습니까?

답변

0

요점은 deserialization시 생성자가 실행되지 않는다는 것입니다.

public class Foo 
{ 
    int test = 10; 
} 

이 사실이 컴파일됩니다 :

당신은이 코드를 참조

public class Foo 
{ 
    int test; 

    public Foo() 
    { 
     test = 10; 
    } 
} 

을하지만 생성자는 실행되지 않기 때문에, 모든 멤버 변수에 디폴트 값으로 시작 int test의 경우는 0입니다.

그러면 디시리얼라이저는 OnDeserializingMethod()을 호출하고 test은 3 씩 감소하여 0-3 = -3이됩니다.

0

그래서 직렬화 된 필드의 기본값을 설정하고 있기 때문에 tmp 필드가 -3으로 설정됩니다. Documentation on OnDeserializingAttribute

는 직렬화 복원시에 기본 값을 설정합니다 OnDeserializingAttribute를 사용합니다. 예를 들어 을 비 직렬화하는 형식에 생성자가 포함되어 있지 않으면 인스턴스의 필드 값을 설정하고 해당 특성을 메서드에 적용하는 메서드를 만듭니다.

관련 문제