WCF在没有"set"的属性上扼流.任何解决方法?

And*_*rey 94 c# wcf properties datacontractserializer

我有一些类,我作为服务方法的结果传递,并且该类具有get-only属性:

[DataContract]
public class ErrorBase
{
  [DataMember]
  public virtual string Message { get { return ""; } }
}
Run Code Online (Sandbox Code Playgroud)

我在服务方面遇到异常:

System.Runtime.Serialization.InvalidDataContractException:类型为"MyNamespace.ErrorBase"的属性"Message"没有set方法.

我必须将此属性作为唯一的getter,我不能允许用户为其赋值.我可以使用的任何解决方法?或者我错过了一些额外的属性?

rh.*_*rh. 103

给Message一个公共getter但是受保护的setter,这样只有子类(和DataContractSerializer,因为它作弊:)可能会修改该值.

  • 你甚至可以把它变成私人的.Serializer不介意它是私有的,公共的,受保护的,内部的还是受保护的内部. (27认同)
  • 并使setter` throw new NotSupportedException()` (8认同)
  • 如果使用`[DataContract]`和`[DataMember]`,则具有`private set;`是有效的。如果省略它们,则需要`public set;`。 (2认同)

Rus*_*ell 12

即使您不需要更新该值,WCFSerializer也会使用setter来反序列化该对象(并重新设置该值).

这就是你所追求的: WCF DataContracts


Rik*_*tel 11

[DataMember(Name = "PropertyName")]
public string PropertyName
{
    get
    {
        return "";
    }
    private set
    { }
}
Run Code Online (Sandbox Code Playgroud)


mar*_*c_s 5

你就不能有一个“什么都不做”的二传手吗??

[DataContract]
public class ErrorBase
{
  [DataMember]
  public virtual string Message 
  {
      get { return ""; } 
      set { }
  }
}
Run Code Online (Sandbox Code Playgroud)

或者 DataContract 序列化程序也会对此感到厌烦吗??

  • 这并不可怕,我只是不想让使用客户端 API 的开发人员认为他们可以将内容分配给属性。 (14认同)

小智 5

如果您只有一个吸气剂,为什么还需要序列化该属性.您似乎可以删除只读属性的DataMember属性,并且序列化程序将忽略该属性.

  • 将派生属性(例如,从ID属性计算的URL属性)序列化为持久存储(例如,数据库)确实没有意义 - 为此进行投票 - 但是将它序列化为API请求返回的表示(例如,JSON或XML). (3认同)