Tengo una clase que estoy pasando como resultado de un método de servicio, y esa clase tiene una propiedad de solo obtención:
[DataContract]
public class ErrorBase
{
[DataMember]
public virtual string Message { get { return ""; } }
}
Recibo una excepción en el lado del servicio:
System.Runtime.Serialization.InvalidDataContractException: ningún método establecido para la propiedad 'Mensaje' en el tipo 'MyNamespace.ErrorBase'.
Tengo que tener esta propiedad como único captador, no puedo permitir que los usuarios le asignen un valor. ¿Alguna solución alternativa que pueda utilizar? ¿O me falta algún atributo adicional?
c#
wcf
properties
datacontractserializer
Andrey
fuente
fuente
throw new NotSupportedException()
private set;
funciona si usa[DataContract]
y[DataMember]
. Si los omite, necesitapublic set;
.Incluso si no necesita actualizar el valor, WCFSerializer usa el setter para deserializar el objeto (y restablecer el valor).
Esto es lo que busca : WCF DataContracts
fuente
fuente
Si solo tiene un captador, ¿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.
fuente
¿No podrías tener un armador de "no hacer nada"?
¿O el serializador de DataContract también lo hace?
fuente
Las propiedades con el atributo DataMember siempre requieren un conjunto. Debe volver a escribir un objeto similar en la aplicación cliente, ya que a los miembros de DataContract siempre se les pueden asignar valores.
fuente
Tuve este problema con ASP.NET MVC y yo quería usar DataContractSerializer para poder controlar los nombres de los elementos en la salida JSON. Finalmente, cambié el serializador a JSON.NET, que admite propiedades sin establecedores (que DataContractSerializer no lo hace) y control de nombre de propiedad (que el serializador JSON incorporado en ASP.NET MVC no) a través de
[JsonProperty(PropertyName = "myName")]
.fuente
Si es una opción viable, en lugar de tenerla
ErrorBase
como clase base, defínala de la siguiente manera:Ahora, aunque existe un establecedor, es inaccesible para el cliente a través del canal WCF, por lo que es como si fuera privado.
fuente
Si su serializador es de tipo
DataContractJsonSerializer
(o cualquieraDataContractSerializer
), también puede usarloDataContractSerializerSettings
en el constructor, con laSerializeReadOnlyTypes
propiedad establecida en true.fuente