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

本文关键字:单个 属性 选择 序列化 对象 | 更新日期: 2023-09-27 18:03:47

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

谢谢

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

是的,当为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]属性来从序列化中排除成员。从使用数据契约:

默认情况下,DataContractSerializer推断数据契约并序列化所有公开可见的类型。类型的所有公共读/写属性和字段都是序列化的。控件将成员从序列化中退出IgnoreDataMemberAttribute。

IgnoreDataMemberAttribute属性仅在与没有标记的类型。这包括未使用其中之一标记的类型DataContractAttribute, SerializableAttribute,CollectionDataContractAttribute或EnumMemberAttribute属性,或通过任何其他方式(例如IXmlSerializable)标记为可序列化的。