2011-03-21 13 views
29

En WCF se puede definir un contrato a través de los [DataContract] y [DataMember] atributos, como esto:¿Por qué no se recomienda el uso de [DataMember (EmitDefaultValue = false)]?

[DataContract] 
public class Sample 
{ 
    [DataMember(EmitDefaultValue = false, IsRequired = false)] 
    public string Test { get; set; } 
} 

This article on the MSDN establece que no se recomienda el uso de EmitDefaultValue = false:

snippet

Sin embargo, me gusta usar esto, porque el XML que se genera con esta construcción es más limpio. Si no se especifica este ajuste en resultados:

<Sample> 
    <Test xsi:nil="true"/> 
</Sample> 

durante el uso de la configuración del elemento se omite, cuando no hay ningún valor:

<Sample> 
</Sample> 

Tengo curiosidad por lo que es el razonamiento detrás de esa declaración. Específicamente, ya que ambos snipptes de XML parecen equivalentes a mí (y ambas últimas partes se pueden deserializar correctamente para este contrato).

¿Cuál es el razonamiento detrás de esta afirmación?

Respuesta

21

El motivo se encuentra en la parte inferior del artículo que enlaza. La versión corta es:

  • Cuando el EmitDefaultValue se establece en false, se representa en el esquema como una anotación específica para Windows Communication Foundation (WCF). No hay una forma interoperable de representar esta información. En particular, el atributo "predeterminado" en el esquema no se utiliza para este propósito, el atributo minOccurs solo se ve afectado por la configuración IsRequired, y el atributo nillable solo se ve afectado por el tipo del miembro de datos.

  • El valor predeterminado real para usar no está presente en el esquema. Es hasta el extremo receptor recibir la interpretación adecuada de un elemento faltante.

+3

La parte importante de esto parece ser la preocupación interoperativa. Si utiliza la tecnología .net en ambos lados de la llamada y los contratos de datos fuertemente tipeados, no debería tener problemas. – Gent

Cuestiones relacionadas