У меня есть класс, который я передаю в результате метода службы, и у этого класса есть свойство только для получения:
[DataContract]
public class ErrorBase
{
[DataMember]
public virtual string Message { get { return ""; } }
}
Я получаю исключение на стороне сервиса:
System.Runtime.Serialization.InvalidDataContractException: не установлен метод для свойства «Сообщение» в типе «MyNamespace.ErrorBase».
У меня должно быть это свойство только как получатель, я не могу разрешить пользователям присваивать ему значение. Какое решение я мог бы использовать? Или мне не хватает какого-то дополнительного атрибута?
throw new NotSupportedException()
private set;
работает , если вы используете[DataContract]
и[DataMember]
. Если вы их опустите, вам понадобитсяpublic set;
.Даже если вам не нужно обновлять значение, установщик используется WCFSerializer для десериализации объекта (и повторной установки значения).
Это то, что вам нужно: WCF DataContracts
источник
источник
Если у вас есть только геттер, зачем вам вообще сериализовать свойство. Похоже, вы могли бы удалить атрибут DataMember для свойства только для чтения, и сериализатор просто проигнорирует это свойство.
источник
Не могли бы вы просто установить "ничего не делать" ??
Или сериализатор DataContract тоже не работает?
источник
Свойства с атрибутом DataMember всегда необходимо указывать. Вы должны переписать аналогичный объект в клиентском приложении, поскольку членам DataContract всегда могут быть присвоены значения.
источник
У меня была эта проблема с ASP.NET MVC, и я хотел использовать DataContractSerializer, чтобы иметь возможность контролировать имена элементов в выводе JSON. В конце концов я переключил сериализатор на JSON.NET, который поддерживает свойства без сеттеров (чего нет в DataContractSerializer) и управление именем свойства (чего не делает встроенный сериализатор JSON в ASP.NET MVC) через
[JsonProperty(PropertyName = "myName")]
.источник
Если это приемлемый вариант, тогда вместо
ErrorBase
базового класса определите его следующим образом:Теперь, несмотря на то, что сеттер существует, он недоступен для клиента через канал WCF, поэтому он как если бы был частным.
источник
Если ваш сериализатор имеет тип
DataContractJsonSerializer
(или любой другойDataContractSerializer
), вы также можете использовать егоDataContractSerializerSettings
в конструкторе,SerializeReadOnlyTypes
установив для свойства значение true.источник