2014-09-15 2 views
0

클라이언트 및 서버 v1에서 다음과 같은 데이터 계약을 체결했다고 가정합니다. 내가 DataContract V2의 새로운 버전으로 서버 업데이트 지금wcf DataContracts의 누락 된 멤버에 대한 기본값을 지정하는 방법은 무엇입니까?

[DataContract] 
    public class Customer 
    { 
     [DataMember] 
     public string Name; 
     [DataMember] 
     public string LastName; 
    } 

-this link 당으로 새 멤버의 나이

[DataMember] 
    public int Age = 25; 

추가를 좋아 위의 모습은 25의 경우에 구성원을 기본합니다 클라이언트가 지정하지 않았습니다.

  • ClientV1 (이전)은 ServerV2 (신규)를 호출합니다.이 경우 클라이언트는 새 구성원을 전달하지 않습니다. 그러나 데이터 멤버의 값이 0임을 알 수 있습니다. 누락 된 멤버는 기본값 25를 가져야합니다.

이 작업을 수행하려면 another way이 필요합니다. DataMember.EmitDefaultValue = True (기본값)인지 확인하십시오.

[DataMember] 
     public int Age; 

     [OnDeserializing] 
     internal void OnDeserializingMethod(StreamingContext context) 
     { 
      Age = 25; 
     } 

제 질문은 필드 이니셜 라이저 방식이 작동하지 않는 이유입니다.

답변

0

역 직렬화 중에는 생성자 또는 필드 초기화 프로그램이 호출되지 않습니다. 나는 후자에 대한 설명서를 찾지 못했지만 동일한 필드에 [DataMember]이 아닌 개인 필드를 넣으면이 필드가 초기화되지 않는다는 것을 알 수 있습니다.

내가 사용하는 방법은 기본값을 설정하고 생성자와 [OnDeserializing] 메서드에서이 메서드를 호출하는 메서드를 정의하는 것이 었습니다.

예를 들어

Public Sub New() 
    SetDefaults() 
End Sub 

' OnDeserializing happens before deserialization 
<OnDeserializing> 
Private Sub OnDeserializing(ByVal c As StreamingContext) 
    SetDefaults() 
End Sub 

Private Sub SetDefaults() 
    Foo = "FooValueV2" 
    Bar = "BarValueV2" 
    OnlyInV2 = "OnlyInV2Value" 
    OnlyInV2Int = 98765 
End Sub 
(VB.NET 내 사용을 용서해주십시오, 내가 손에 가지고 무엇을)
관련 문제