为什么我不能在Wcf对象中指定NonSerialized

时间:2014-03-07 14:01:20

标签: c# wcf datacontractserializer

我有一个班级;

[DataContract]
public class Request
{
   [DataMember]        
   public int Id {get;set;}

   [DataMember]
   public UserType Type { get; set; }
}

我有一个Wcf webservice,当调用该方法时,将该对象加载到Request对象中,我不希望传入的Request修改Type属性。我尝试将类属性设置为

[DataContract]
public class Request
{
    [DataMember]   
    public int Id {get;set;}

    [NonSerialized]
    [DataMember]
    public UserType Type { get; set; }
}

我也试过

[DataContract]
public class Request
{
    [NonSerialized]
    private UserType _type;

    [DataMember]
    public UserType Type 
    {
        get { return _type; }
        set { _type = value; }
    }
}

但在这两种情况下,我都会收到错误'属性' NonSerialized'对此声明类型无效。它仅适用于'字段'声明。

Wcf服务中的Request对象加​​载如;

[OperationContract]
[WebInvoke(Method = "POST", UriTemplate = "/XML/GetTypes", 
 BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Xml)]
XElement XMLGetTypes(Request oRequest) 
{ 
  ...do something with the object
}

或者这个,取决于端点

[OperationContract]
[WebInvoke(Method = "POST", UriTemplate = "/JSON/GetTypes", 
BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json)]
string JSONGetTypes(Request oRequest) 
{ 
  ...do something with the object
 }

我该如何克服这个问题?

1 个答案:

答案 0 :(得分:3)

由于WCF包含新的 serialization engine DataContractSerializer

更明确

  • 如果类被标记为[DataContract],则只会将标记为[DataMember]的成员视为

  • 如果类未标记为[DataContract],则默认为所有内容(以支持POCO),但您可以使用[IgnoreDataMember]

  • 减去成员