serialize serializar example deserialize deserializar data and c# wcf properties datacontractserializer

c# - serializar - WCF se ahoga en propiedades sin "conjunto". Cualquier solución?



wcf datacontract example (8)

Tengo una clase que paso como resultado de un método de servicio, y esa clase tiene una propiedad de solo obtener:

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

Obtengo una excepción en el lado del servicio:

System.Runtime.Serialization.InvalidDataContractException: no hay un método establecido para la propiedad ''Message'' en el tipo ''MyNamespace.ErrorBase''.

Tengo que tener esta propiedad como único getter, no puedo permitir que los usuarios le asignen un valor. ¿Alguna solución alternativa que podría usar? ¿O me falta algún atributo adicional?


¿No podrías tener un colocador de "no hacer nada"?

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

¿O el serializador DataContract también está ahí?


Dé a Message un getter público pero setter protegido, de modo que solo las subclases (y el DataContractSerializer, porque haga trampa :) puedan modificar el valor.


Incluso si no necesita actualizar el valor, el setter es utilizado por el WCFSerializer para deserializar el objeto (y volver a establecer el valor).

Este SO es lo que buscas: WCF DataContracts


Las propiedades con el atributo DataMember siempre requieren establecerse. Debería volver a escribir un objeto similar en la aplicación cliente ya que a los miembros de DataContract siempre se les pueden asignar valores.


Si se trata de una opción viable, en lugar de tener ErrorBase como clase base, ErrorBase la siguiente manera:

public interface IError { string Message { [OperationContract] get; // leave unattributed set; } }

Ahora, aunque existe un setter, es inaccesible para el cliente a través del canal WCF, por lo que es como si fuera privado.


Si solo tiene un getter, ¿por qué necesita serializar la propiedad? Parece que podría eliminar el atributo DataMember para la propiedad de solo lectura, y el serializador simplemente ignoraría la propiedad.


Tuve este problema con ASP.NET MVC y con querer usar DataContractSerializer para poder controlar los nombres en los elementos en la salida JSON. Eventualmente cambié el serializador a JSON.NET, que admite propiedades sin setters (que DataContractSerializer no) y control de nombre de propiedad (que el serializador JSON integrado en ASP.NET MVC no) a través de [JsonProperty(PropertyName = "myName")] .


[DataMember(Name = "PropertyName")] public string PropertyName { get { return ""; } private set { } }