对象序列化:选择单个属性

时间:2011-07-27 13:07:52

标签: c# wcf serialization .net-4.0

一个愚蠢的问题:假设我有一个存储在viewstate中的对象。我把它标记为Serializable。我还在我的WCF服务中重用了相同的对象。但是,Web服务序列化并公开了一些不必要/安全的内部属性,以显示给服务客户端。有没有办法允许ViewState的字段/属性序列化而不是Web服务? [NonSerialized]隐藏两者的属性。 我知道我可以实现一个POCO用于Web服务,但我想保持方法/对象签名不变,只要类名。 只是想知道是否有办法。如果没有,我将不得不在ViewState中没有这些字段,或者创建POCO并让客户担心重新实现他们的客户。

由于

1 个答案:

答案 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)标记为可序列化。