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, поэтому он как бы является частным.