2010-07-29 48 views
5

我有這樣我可以防止特定的數據庫被反序列化嗎?

​​

有時我想阻止DM2從一個OperationContract的返回時被反序列化一個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; 
} 

然後設置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

順便說一句,你可以序列化字段和屬性,無論無障礙的:privateprotectedinternalprotected internal,或public。您可以序列化任何讀/寫屬性,而不僅僅是字段。關於收集類型的序列化,請參閱http://msdn.microsoft.com/en-us/library/aa347850.aspx。要做到這一點

6

一種方法是在DataMemberAttribute的EmitDefaultValue屬性設置爲false:

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

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

    [DataMember] 
    public string DM3; 
} 

然後將此屬性設置爲null:

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

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

    return mdc; 
} 

這樣一來,該財產不在序列化過程中寫入輸出流。

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

+0

那如果我創建實際的對象我想序列的副本,工作不要」不在乎更改副本。不過,我想在不改變我想要序列化的對象的情況下做到這一點。 – floatingfrisbee 2010-08-13 04:47:51