2009-10-14 11 views
5

Tengo un contrato de la siguiente manera:WCF DataContract - órgano de marcado isRequired = false

[DataContract] 
public class MyObj 
{ 
    [DataMember(IsRequired=true)] 
    public string StrA {get; private set;} 

    [DataMember(IsRequired=false)] 
    public string StrB {get; private set;} 
} 

¿Qué significa exactamente IsRequired? ¿Significa IsRequired=false que puedo pasar una instancia de MyObj a través del cable con StrB unificado o significa que puedo pasar una instancia de MyObj a través del cable con StrB ausente?

En este último caso, ¿cómo realizo la instancia + envío a través de una instancia de MyObj sin StrB?

Respuesta

3

DataMember 's IsRequired le dice al motor de serialización si el valor de StrB debe presentarse en el XML subyacente.

Así que por el cable puede obtener <MyObj></MyObj> y se deserializará en una instancia de MyObj bien.

Editar: En realidad, no se puede inicializar una instancia de MyObj sin StrB presente. El uso para esto es compatibilidad y extensibilidad. Por ejemplo, tal vez el cliente no tenga la versión actualizada de MyObj y no tenga StrB presente. En este caso, el código del servidor puede marcar StrB como no requerido y no habrá una excepción de serialización cuando se reciba un mensaje en el servidor.

+0

bien, así que, dada mi clase anterior, podría enviar abc - eso es lo que está diciendo, ¿no? Si es así, ¿cómo instanciar MyObj con StrA pero no con StrB ... ?? –

+0

Sí, eso es lo que estoy diciendo. No sé si su DataContract funcionará bien. No estoy seguro de si DataMember requiere un getter/setter público. No puede crear una instancia de MyObj con StrA pero no con StrB utilizando el código anterior. Si crea otra versión de MyObj que no contenga StrB, entonces podría. –

2

¿cómo realmente crear una instancia + enviar través de una instancia de MyObj sin strb?

Como acabo de mencionar en WCF and Anonymous Types, puede usar [DataMember (EmitDefaultValue = false)]. Esto asegurará que cuando el miembro de datos esté en su valor predeterminado (por ejemplo, nulo para cadenas), no se emitirá.

Cuestiones relacionadas