WCF задыхается от свойств без "набора". Любое решение? - PullRequest
93 голосов
/ 24 февраля 2010

У меня есть некоторый класс, который я передаю в результате использования метода службы, и этот класс имеет свойство только для получения:

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

Я получаю исключение на стороне обслуживания:

System.Runtime.Serialization.InvalidDataContractException: не установлено метод для свойства 'Message' в типе 'MyNamespace.ErrorBase'.

У меня должно быть это свойство как единственного получателя, я не могу позволить пользователям назначать ему значение. Любой обходной путь, который я мог бы использовать? Или мне не хватает какого-то дополнительного атрибута?

Ответы [ 8 ]

101 голосов
/ 24 февраля 2010

Предоставить Message общедоступный метод получения, но защищенный метод установки, чтобы только подклассы (и DataContractSerializer, потому что он обманывал :), могли изменять значение.

12 голосов
/ 24 февраля 2010

Даже если вам не нужно обновлять значение, установщик используется WCFSerializer для десериализации объекта (и переустановки значения).

Это ТАК, что вы ищете: WCF DataContracts

10 голосов
/ 06 августа 2012
[DataMember(Name = "PropertyName")]
public string PropertyName
{
    get
    {
        return "";
    }
    private set
    { }
}
5 голосов
/ 24 сентября 2016

Если у вас есть только геттер, зачем вообще сериализовать свойство. Кажется, что вы можете удалить атрибут DataMember для свойства только для чтения, а сериализатор просто проигнорирует это свойство.

3 голосов
/ 24 февраля 2010

Не могли бы вы просто установить сеттер "ничего не делать" ??

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

Или в этом тоже прецедент сериализатора DataContract ??

2 голосов
/ 26 мая 2012

Если это жизнеспособный вариант, тогда вместо базового класса ErrorBase определите его следующим образом:

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

            // leave unattributed
            set;
        }
    }

Теперь, даже несмотря на то, что сеттер существует, он недоступен для клиента через канал WCF, поэтому он как бы частный.

2 голосов
/ 13 сентября 2011

У меня была эта проблема с ASP.NET MVC, и я хотел использовать DataContractSerializer, чтобы иметь возможность управлять именами элементов в выводе JSON. В конце концов я переключил сериализатор на JSON.NET, который поддерживает свойства без сеттеров (чего нет у DataContractSerializer) и контроль имени свойства (чего нет у встроенного сериализатора JSON в ASP.NET MVC) через [JsonProperty(PropertyName = "myName")].

2 голосов
/ 24 февраля 2010

Свойства с атрибутом DataMember всегда требуют установки. Вам следует заново написать simmilar-объект в клиентском приложении, поскольку членам DataContract всегда могут быть присвоены значения.

...