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

C# 对象序列化:选择单个属性,c#,wcf,serialization,.net-4.0,C#,Wcf,Serialization,.net 4.0,一个愚蠢的问题:假设我有一个存储在viewstate中的对象。我已将其标记为可序列化。我还在WCF服务中重用相同的对象。但是web服务序列化并公开一些内部属性,这些属性对于向服务客户机显示是不必要/不安全的。是否有一种方法允许ViewState的字段/属性序列化,但不允许Web服务?[非序列化]对这两个对象隐藏属性。 我知道我可以实现一个用于web服务的POCO,但我希望保持方法/对象签名与类名一样不变。 只是想知道有没有办法。如果没有,我将不得不在ViewState中没有这些字段,或者创建PO

一个愚蠢的问题:假设我有一个存储在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)标记为可序列化


据我所知,您不需要在.NET4中使用DataContract/DataMember来修饰对象/属性,以便通过WCF序列化它们。我确信我试图隐藏的这些属性没有标记为DataMembers,它们仍然是序列化的。@Dimitri将它们包括在内仍然是最佳做法。好的,我的场景是:我有一个类MyClass,它被标记为DataContract,属性被标记为DataMember。此类的某些属性未标记为DataMember,并且它们未被序列化。但该类继承自另一个标记为Serializable但不是DataContract的类MyBaseClass。该基类的属性显示在序列化中。因此,如果我将基类修饰为DataContract,而不是将其属性修饰为DataMembers,它们就不应该序列化为web服务?@Dimitri:请参见我的编辑。您可以在所有要序列化的字段(用于选择加入)上使用[DataContract]和[DataMember],也可以在不想序列化的字段(用于选择退出)上使用[IgnoreDataMember]。很酷,谢谢。我确实试过IgnoreDataMember,但我想我做错了什么。现在,我将基类标记为DataContract,但没有将其任何属性标记为DataMember,它们也没有经过检查。