WCF窒息属性没有“设置”。 任何解决方法?
我有一些我通过服务方法传递的类,并且该类具有只读属性:
[DataContract] public class ErrorBase { [DataMember] public virtual string Message { get { return ""; } } }
我在服务方面得到一个例外:
System.Runtime.Serialization.InvalidDataContractException:types为“MyNamespace.ErrorBase”的属性“Message”没有设置方法。
我必须把这个属性当作getter,我不能让用户给它赋值。 任何解决方法,我可以使用? 还是我缺less一些额外的属性?
给消息一个公共getter但受保护的setter,以便只有子类(和DataContractSerializer,因为它作弊:)可能会修改该值。
即使您不需要更新该值,该设置器也会被WCFSerializer用于反序列化对象(并重新设置该值)。
这就是你所追求的: WCF DataContracts
[DataMember(Name = "PropertyName")] public string PropertyName { get { return ""; } private set { } }
如果你只有一个getter,你为什么需要序列化财产。 看来你可以删除只读属性的DataMember属性,并且序列化程序只会忽略该属性。
难道你不能只有一个“不做”的二传手?
[DataContract] public class ErrorBase { [DataMember] public virtual string Message { get { return ""; } set { } } }
还是DataContract序列化器barf呢?
具有DataMember属性的属性始终需要设置。 您应该在客户端应用程序上重新编写simmilar对象,因为DataContract成员始终可以分配值。
我有ASP.NET MVC的这个问题,我想要使用DataContractSerializer,以便能够控制JSON输出项目的名称。 最后,我将序列化程序切换到JSON.NET,它支持没有setter(DataContractSerializer没有)和属性名称控制(ASP.NET MVC内置的JSON序列化程序没有)的[JsonProperty(PropertyName = "myName")]
。
如果它是一个可行的选项,那么不是以ErrorBase
作为基类,而是将其定义如下:
public interface IError { string Message { [OperationContract] get; // leave unattributed set; } }
现在,即使存在setter,通过WCF通道客户端也无法访问,所以就好像它是私有的。