2011-07-27 36 views
2

一個愚蠢的問題:比方說,我有一個對象,我存儲在視圖狀態。我把它標記爲可序列化。我也在我的WCF服務中重用了相同的對象。但是,Web服務會序列化並公開顯示給服務客戶端的一些不必要/安全的內部屬性。有沒有辦法允許ViewState的字段/屬性序列化,而不是Web服務? [NonSerialized]隱藏兩者的屬性。 我知道我可以爲Web服務使用實現一個POCO,但我想保持方法/對象簽名的類名不變。 只是想知道是否有辦法。如果沒有,我必須要麼沒有ViewState中的這些字段,要麼創建POCO,讓客戶擔心重新實現客戶端。對象序列化:選擇單個屬性

感謝

回答

3

是,創建Web服務的DataContract時,您標記要包含在服務請求,並與[DataMember]屬性回覆的成員。

[DataContract] 
[Serializable] 
public class MyData 
{ 
    private int id_value; 

    // Apply the DataMemberAttribute to the property. 
    [DataMember] 
    public int ID 
    { 

     get { return id_value; } 
     set { id_value = value; } 
    } 

    public int DontExposeMeToWcf { get; set; } 
} 

編輯:在.NET 4.0中,你還可以使用[IgnoreDataMember]屬性來排除系列化的成員。從Using Data Contracts

默認情況下,DataContractSerializer的 推斷數據合同串行化所有公開可見的類型。 所有公開的讀/寫屬性和類型的字段都是 序列化的。您可以通過使用 IgnoreDataMemberAttribute來選擇退出序列化成員。

只有與 未標記類型一起使用時,纔會遵守IgnoreDataMemberAttribute屬性。這包括未標記爲通過任何其他方式(例如IXmlSerializable)可序列化的DataContractAttribute,SerializableAttribute, CollectionDataContractAttribute或EnumMemberAttribute屬性或 之一的類型。

+0

據我所知,您不需要在.NET 4中使用DataContract/DataMember來裝飾對象/屬性,以便通過WCF對它們進行序列化。我確實知道我試圖隱藏的這些屬性並未標記爲DataMembers,它們仍然是序列化的。 – Dimitri

+0

@Dimitri包含它們仍然是最佳做法。 –

+0

好的,我的方案是:我有一個MyClass類,它標記爲DataContract並具有標記爲DataMember的屬性。該類的某些屬性未標記爲DataMember,並且未被序列化。但是這個類繼承自標記爲Serializable的另一個類MyBaseClass,但不是DataContract。這個基類的屬性在序列化中顯示。所以如果我裝飾基類作爲DataContract,而不是裝飾它的屬性作爲DataMembers他們不應該序列化到Web服務? – Dimitri