2010-02-24 103 views
85

我有一些类,我传递作为服务方法的结果,那类有一个专用的获取属性:WCF在没有“设置”的属性上扼流圈。任何解决方法?

[DataContract] 
public class ErrorBase 
{ 
    [DataMember] 
    public virtual string Message { get { return ""; } } 
} 

我得到的服务端异常:

System.Runtime.Serialization.InvalidDataContractException:没有设置 属性'Message'的类型为'MyNamespace.ErrorBase'的方法。

我必须把这个属性当作只有getter,我不能让用户给它赋值。我可以使用任何解决方法?或者我错过了一些额外的属性?

回答

93

给消息一个公共的getter但保护的二传手,所以只有子类(和DataContractSerializer的,因为它欺骗:)可以修改的值。

+1

其实,它在我的情况下效果最好!谢谢! – Andrey 2010-02-24 22:22:41

+0

这是一个很好的解决方案! – Russell 2010-03-01 02:01:12

+0

谢谢,很高兴它是有用的!这实际上只是这个技巧的几个用途之一。由于getter和setter在技术上是功能性的,所以你也可以使用这种相同的技术来提供基本类型的自定义序列化(可能是XML中的自定义时间格式),而不需要使用恐吓IDataContractSurrogate。 – 2010-03-01 18:02:43

12

即使您不需要更新该值,该设置器也会被WCFSerializer用于反序列化对象(并重新设置该值)。

这SO为你所追求的: WCF DataContracts

+1

所以我解决这个问题的唯一方法是让它成为一种方法而不是属性?再次,我不能允许“设置”在这个属性 – Andrey 2010-02-24 02:33:37

+0

你可以使它成为一种方法(例如GetMessage(){return“”;})或者,我非常确定你可以告诉WCF串行器忽略它。我会看看我能找到并让你知道。, – Russell 2010-02-24 02:34:58

+1

这个stackoverflow问题击中了头上的指甲:http://stackoverflow.com/questions/172681/wcf-datacontracts – Russell 2010-02-24 02:36:08

3

难道你不能只有一个“什么都不做”二传手?或者DataContract序列化程序barf也是这样吗?

+13

它并不禁止,我只是不想让使用客户端API的开发人员认为他们可以将东西分配给属性。 – Andrey 2011-10-14 18:10:44

2

具有DataMember属性的属性始终需要设置。您应该在客户端应用程序上重新编写simmilar对象,因为DataContract成员始终可以分配值。

2

我有ASP.NET MVC这个问题,我想要使用DataContractSerializer,以便能够控制JSON输出中的项目名称。最后,我将序列化程序切换到JSON.NET,它通过[JsonProperty(PropertyName = "myName")]支持没有setter(DataContractSerializer没有)和属性名称控制(ASP.NET MVC中的内置JSON序列化程序没有)的属性。

2

如果它是一个可行的选择,然后而不是ErrorBase作为基类,如下定义它:

public interface IError 
    { 
     string Message 
     { 
      [OperationContract] 
      get; 

      // leave unattributed 
      set; 
     } 
    } 

现在,即使制定者存在,它是不可访问通过WCF通道的客户端,因此就好像它是私人的。

7
[DataMember(Name = "PropertyName")] 
public string PropertyName 
{ 
    get 
    { 
     return ""; 
    } 
    private set 
    { } 
} 
5

如果你只有一个getter,你为什么需要序列化属性。您似乎可以删除只读属性的DataMember属性,并且序列化程序只会忽略该属性。

+2

将派生属性(例如,从ID属性计算出来的URL属性)序列化到持久性存储(例如数据库)确实没有意义 - 向上投票 - 但将它序列化为由API请求返回的表示形式(例如,JSON或XML)。 – 2017-05-12 13:21:36

相关问题