一个愚蠢的问题:假设我有一个存储在viewstate中的对象。我把它标记为Serializable。我还在我的WCF服务中重用了相同的对象。但是,Web服务序列化并公开了一些不必要/安全的内部属性,以显示给服务客户端。有没有办法允许ViewState的字段/属性序列化而不是Web服务? [NonSerialized]隐藏两者的属性。 我知道我可以实现一个POCO用于Web服务,但我想保持方法/对象签名不变,只要类名。 只是想知道是否有办法。如果没有,我将不得不在ViewState中没有这些字段,或者创建POCO并让客户担心重新实现他们的客户。
由于
答案 0 :(得分: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属性仅在使用时受到尊重 没有标记的类型。这包括未标记其中一个的类型 DataContractAttribute,SerializableAttribute, CollectionDataContractAttribute或EnumMemberAttribute属性,或 通过任何其他方式(例如IXmlSerializable)标记为可序列化。