2010-07-29 3 views
5

나는이특정 datamember가 deserialize되는 것을 방지 할 수 있습니까?

[DataContract] 
class MyDC 
{ 
    [DataMember] 
    public string DM1; 

    [DataMember] 
    public string DM2; 

    [DataMember] 
    public string DM3; 
} 

내가 OperationContract를에서 반환 될 때 직렬화 복원되는 DM2 않도록하려면 때로는 같은 datacontract 있습니다. 이런 식으로 뭔가가 :

[OperationContact] 
public MyDC GetMyDC() 
{ 
    MyDC mdc = new MyDC(); 

    if (condition) 
    { 
     // Code to prevent DM2 from being deserialized 
    } 

    return mdc; 
} 

나는 항상에만 DM1과 DM3을 가진 새 DataContract을하고 MyDC 인스턴스에서 해당을 생성하지만 프로그래밍 방식 DM2을 제거 할 수 있다면보고 싶어 할 수있다. 가능한가? 방법?

답변

2
[DataContract] 
class MyDC 
{ 
    [DataMember] 
    public string DM1; 

    public string DM2; 

    public bool IsDM2Serializable; 

    [DataMember(Name="DM2", EmitDefaultValue = false)] 
    public string DM2SerializedConditionally 
    { 
     get 
     { 
      if(IsDM2Serializable) 
       return null; 
      return DM2; 
     } 
     set { DM2=value; } 
    } 

    [DataMember] 
    public string DM3; 
} 

당신이 그것을 숨길 필요가있을 때 그런 false로 IsDM2Serializable 설정 : 나는 직렬화 할 실제 객체의 복사본을 생성하고 있어요 경우 작동

[OperationContact] 
public MyDC GetMyDC() 
{ 
    MyDC mdc = new MyDC(); 

    if (condition) 
    { 
     // Code to prevent DM2 from being serialized 
     mdc.IsDM2Serializable = false; 
    } 

    return mdc; 
} 
3

당신이 의미하는 것은 직렬화이며 비 직렬화가 아닙니다. 당신이 클래스에 [DataContract] 속성을 적용 직렬화 클래스를 준비한다면

[DataMember] 속성을 가진 클래스의 구성원 만이 직렬화됩니다 좀 더 복잡한 경우

[DataContract] 
class MyDC 
{ 
    [DataMember] 
    public string DM1; 

    public string DM2; 

    [DataMember] 
    public string DM3; 
} 

[IgnoreDataMember]의 사용 수 당신의 문제를 해결하십시오. 당신이 접근성에 관계없이 필드와 속성을 직렬화 할 수 있습니다, 그런데

을 (http://msdn.microsoft.com/en-us/library/ms733127.aspx 참조) : private, protected, internal, protected internal, 또는 public을. 필드뿐만 아니라 모든 읽기/쓰기 속성을 직렬화 할 수 있습니다. 컬렉션 유형의 serialization 정보는 http://msdn.microsoft.com/en-us/library/aa347850.aspx을 참조하십시오. 그 속성은하지 않습니다

[OperationContact] 
public MyDC GetMyDC() 
{ 
    MyDC mdc = new MyDC(); 

    if (condition) 
    { 
     // Code to prevent DM2 from being deserialized 
     mdc.DM2 = null; 
    } 

    return mdc; 
} 

이 방법 :

[DataContract] 
class MyDC 
{ 
    [DataMember] 
    public string DM1; 

    [DataMember(EmitDefaultValue = false)] 
    public string DM2; 

    [DataMember] 
    public string DM3; 
} 

그런 널 (null)이 속성을 설정 :이 작업을 수행하는

6

한 가지 방법은 false로 DataMemberAttribute의 EmitDefaultValue 속성을 설정하는 것입니다 직렬화시 출력 스트림에 기록됩니다.

http://msdn.microsoft.com/en-us/library/aa347792.aspx

+0

돈 ' 사본을 바꾸는 것에 신경을 쓰지 마라. 그러나, 나는 serialize하려고하는 개체를 변경하지 않고 그것을하고 싶습니다. – floatingfrisbee