WCF подавляется свойствами без "set". Есть обходной путь?
У меня есть класс, который я передаю в результате метода службы, и этот класс имеет свойство get-only:
[DataContract]
public class ErrorBase
{
[DataMember]
public virtual string Message { get { return ""; } }
}
Я получаю исключение на стороне сервиса:
8 ответов
дайте сообщению общедоступный геттер, но защищенный сеттер, так что только подклассы (и DataContractSerializer, потому что он обманывает :) могут изменить значение.
даже если вам не нужно обновлять значение, сеттер используется WCFSerializer для десериализации объекта (и повторной установки значения).
Это так то, что вы после: WCF DataContracts
[DataMember(Name = "PropertyName")]
public string PropertyName
{
get
{
return "";
}
private set
{ }
}
Если у вас есть только геттер, почему вам нужно сериализовать свойство вообще. Похоже, вы можете удалить атрибут DataMember для свойства только для чтения, а сериализатор просто проигнорирует свойство.
Не могли бы вы просто иметь сеттер "ничего не делать"??
[DataContract]
public class ErrorBase
{
[DataMember]
public virtual string Message
{
get { return ""; }
set { }
}
}
или при этом тоже рвота сериализатора DataContract??
свойства с атрибутом DataMember всегда требуют set. Необходимо повторно записать объект simmilar в клиентском приложении, так как членам DataContract всегда могут быть назначены значения.
У меня была эта проблема с ASP.NET MVC и я хотим использовать DataContractSerializer, чтобы иметь возможность управлять именами элементов в выходных данных JSON. В конце концов я переключил сериализатор на JSON.NET, который поддерживает свойства без сеттеров (которые DataContractSerializer не делает) и управления именем свойства (который встроенный сериализатор JSON в ASP.NET MVC не) через [JsonProperty(PropertyName = "myName")]
.
Если это жизнеспособный вариант, то вместо того, чтобы иметь ErrorBase
в качестве базового класса, определить его следующим образом:
public interface IError
{
string Message
{
[OperationContract]
get;
// leave unattributed
set;
}
}
теперь, даже если сеттер существует, он недоступен клиенту через канал WCF, поэтому он как бы является частным.