2010-07-29 30 views
5

Tôi có một DataContract như thế nàyTôi có thể ngăn chặn một số dữ liệu cụ thể không được deserialized?

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

    [DataMember] 
    public string DM2; 

    [DataMember] 
    public string DM3; 
} 

đôi khi tôi muốn ngăn chặn DM2 khỏi bị deserialized khi được trở về từ một OperationContract. Một cái gì đó như thế này:

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

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

    return mdc; 
} 

tôi luôn luôn có thể làm cho một DataContract mới mà chỉ có DM1 và DM3 và tạo ra rằng từ dụ MyDC nhưng tôi muốn để xem nếu nó có thể loại bỏ programatically DM2. Có thể không? Làm sao?

Trả lời

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; 
} 

Sau đó thiết lập IsDM2Serializable false khi bạn cần phải giấu nó:

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

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

    return mdc; 
} 
3

Ý bạn là serialization chứ không phải deserialization.

Nếu bạn chuẩn bị một lớp cho serialization áp dụng [DataContract] thuộc tính đến lớp, chỉ có các thành viên của lớp có [DataMember] thuộc tính sẽ được tuần tự:

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

    public string DM2; 

    [DataMember] 
    public string DM3; 
} 

Trong một số trường hợp phức tạp hơn việc sử dụng [IgnoreDataMember] thể giải quyết vấn đề của bạn. (Xem http://msdn.microsoft.com/en-us/library/ms733127.aspx)

Bằng cách này, bạn có thể serialize các lĩnh vực và các tài sản, bất kể khả năng tiếp cận: private, protected, internal, protected internal, hoặc public. Bạn có thể tuần tự hóa bất kỳ thuộc tính đọc/ghi nào và không chỉ các trường. Về việc sắp xếp theo thứ tự các loại bộ sưu tập, hãy xem http://msdn.microsoft.com/en-us/library/aa347850.aspx.

6

Một cách để làm điều này là để thiết lập các thuộc tính của DataMemberAttribute EmitDefaultValue false:

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

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

    [DataMember] 
    public string DM3; 
} 

Sau đó, thiết lập thuộc tính này để null:

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

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

    return mdc; 
} 

Bằng cách này, tài sản đó không được ghi vào luồng đầu ra trên serialization.

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

+0

đó làm việc nếu tôi đang tạo ra một bản sao của đối tượng thực tế tôi muốn serialize, và don' t quan tâm đến việc thay đổi bản sao. Tuy nhiên, tôi muốn làm điều đó mà không thay đổi đối tượng mà tôi đang cố gắng sắp xếp. – floatingfrisbee