У меня есть класс, который я передаю в результате метода службы, и этот класс имеет свойство get-only:
[DataContract]
public class ErrorBase
{
[DataMember]
public virtual string Message { get { return ""; } }
}
Я получаю исключение со стороны службы:
System.Runtime.Serialization.InvalidDataContractException: не установлено метод для свойства "Сообщение" в типе "MyNamespace.ErrorBase".
Я должен иметь это свойство только как getter, я не могу позволить пользователям назначать ему значение. Любое обходное решение, которое я мог бы использовать? Или мне не хватает дополнительного атрибута?
Ответ 1
Дайте сообщение публичному получателю, но защищенному сеттеру, так что только подклассы (и DataContractSerializer, потому что он обманывает:), могут изменять значение.
Ответ 2
Даже если вам не нужно обновлять значение, setter используется WCFSerializer для десериализации объекта (и переопределения значения).
Это то, что вам нужно:
WCF DataContracts
Ответ 3
[DataMember(Name = "PropertyName")]
public string PropertyName
{
get
{
return "";
}
private set
{ }
}
Ответ 4
Если у вас есть только получатель, зачем вам вообще сериализовать свойство. Похоже, вы можете удалить атрибут DataMember для свойства только для чтения, и сериализатор просто проигнорирует свойство.
Ответ 5
Не могли бы вы просто настроить "do-nothing"?
[DataContract]
public class ErrorBase
{
[DataMember]
public virtual string Message
{
get { return ""; }
set { }
}
}
Или также делает сериализатор DataContract barf тоже?
Ответ 6
Свойства с атрибутом DataMember всегда требуют набора. Вы должны переписать simmilar-объект в клиентское приложение, так как членам DataContract всегда могут присваиваться значения.
Ответ 7
У меня была эта проблема с ASP.NET MVC, и я хотел использовать DataContractSerializer, чтобы иметь возможность управлять именами элементов на выходе JSON. В конце концов я переключил сериализатор на JSON.NET, который поддерживает свойства без сеттеров (без DataContractSerializer) и управления именем свойства (который встроенный JSON-сериализатор в ASP.NET MVC не) через [JsonProperty(PropertyName = "myName")]
.
Ответ 8
Если это жизнеспособный вариант, то вместо ErrorBase
в качестве базового класса определите его следующим образом:
public interface IError
{
string Message
{
[OperationContract]
get;
// leave unattributed
set;
}
}
Теперь, несмотря на то, что сеттер существует, он недоступен клиенту через канал WCF, поэтому он как бы закрытый.