wcf - que - reference datacontract
¿Por qué no se recomienda el uso de[DataMember(EmitDefaultValue=false)]? (1)
En WCF puede definir un contrato utilizando los atributos [DataContract]
y [DataMember]
, como este:
[DataContract]
public class Sample
{
[DataMember(EmitDefaultValue = false, IsRequired = false)]
public string Test { get; set; }
}
Este artículo en MSDN establece que no se recomienda usar EmitDefaultValue = false
:
Sin embargo, me gusta usar esto, porque el XML que se genera con esta construcción es más limpio. No especificar esta configuración da como resultado:
<Sample>
<Test xsi:nil="true"/>
</Sample>
al utilizar la configuración, el elemento se omite cuando no hay ningún valor:
<Sample>
</Sample>
Tengo curiosidad por saber cuál es el razonamiento detrás de esa afirmació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 declaración?
El motivo está en la parte inferior del artículo al que enlazas. La versión corta es:
Cuando
EmitDefaultValue
se establece en falso, se representa en el esquema como una anotación específica de Windows Communication Foundation (WCF). No hay una forma interoperable de representar esta información. En particular, el atributo "predeterminado" en el esquema no se usa para este propósito, el atributominOccurs
se ve afectado solo por la configuraciónIsRequired
, y el atributonillable
se ve afectado solo 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.