Tenho uma classe que estou passando como resultado de um método de serviço e essa classe tem uma propriedade get-only:
[DataContract]
public class ErrorBase
{
[DataMember]
public virtual string Message { get { return ""; } }
}
Estou recebendo uma exceção no lado do serviço:
System.Runtime.Serialization.InvalidDataContractException: Nenhum método definido para a propriedade 'Message' no tipo 'MyNamespace.ErrorBase'.
Preciso ter essa propriedade como apenas getter, não posso permitir que os usuários atribuam um valor a ela. Alguma solução alternativa que eu possa usar? Ou estou faltando algum atributo adicional?
c#
wcf
properties
datacontractserializer
Andrey
fonte
fonte
throw new NotSupportedException()
private set;
funciona se você usar[DataContract]
e[DataMember]
. Se você omiti-los, você precisapublic set;
.Mesmo se você não precisar atualizar o valor, o setter é usado pelo WCFSerializer para desserializar o objeto (e redefinir o valor).
Este SO é o que você procura : WCF DataContracts
fonte
fonte
Se você só tem um getter, por que precisa serializar a propriedade? Parece que você poderia remover o atributo DataMember da propriedade somente leitura e o serializador simplesmente ignoraria a propriedade.
fonte
Você não poderia simplesmente ter um setter "não fazer nada" ??
Ou o serializador DataContract barf também ??
fonte
Propriedades com atributo DataMember sempre requerem conjunto. Você deve reescrever o objeto semelhante no aplicativo cliente, pois os membros DataContract sempre podem receber valores.
fonte
Eu tive esse problema com a ASP.NET MVC e eu queria usar DataContractSerializer para poder controlar os nomes dos itens na saída JSON. Por fim, mudei o serializador para JSON.NET, que oferece suporte a propriedades sem setters (que DataContractSerializer não oferece) e controle de nome de propriedade (que o serializador JSON integrado na ASP.NET MVC não oferece)
[JsonProperty(PropertyName = "myName")]
.fonte
Se for uma opção viável, em vez de ter
ErrorBase
como classe base, defina-a da seguinte maneira:Agora, mesmo que exista um setter, ele está inacessível para o cliente via canal WCF, então é como se fosse privado.
fonte
Se seu serializador for do tipo
DataContractJsonSerializer
(ou qualquer outroDataContractSerializer
), você também pode usarDataContractSerializerSettings
no construtor, com aSerializeReadOnlyTypes
propriedade definida como true.fonte