Valores predeterminados de los miembros de datos

En .NET Framework, los tipos tienen un concepto de valores predeterminados. Por ejemplo, para cualquier tipo de referencia el valor predeterminado es null, y para un tipo entero es cero. En ocasiones es deseable omitir un miembro de datos de los datos serializados cuando está establecido en su valor predeterminado. Dado que el miembro tiene un valor predeterminado, no es necesario serializar un valor real; esto es una ventaja en cuanto al rendimiento.

Para omitir un miembro de los datos serializados, establezca la propiedad EmitDefaultValue del atributo DataMemberAttribute en false (el valor predeterminado es true).

Nota

Debe establecer la propiedad EmitDefaultValue en false si hubiese una necesidad concreta de hacerlo, como para reducir el tamaño de los datos u ofrecer interoperabilidad.

Ejemplo

El siguiente código tiene varios miembros con el EmitDefaultValue establecido en false.

[DataContract]
public class Employee
{
    [DataMember]
    public string employeeName = null;
    [DataMember]
    public int employeeID = 0;
    [DataMember(EmitDefaultValue = false)]
    public string position = null;
    [DataMember(EmitDefaultValue = false)]
    public int salary = 0;
    [DataMember(EmitDefaultValue = false)]
    public int? bonus = null;
    [DataMember(EmitDefaultValue = false)]
    public int targetSalary = 57800;
}
<DataContract()> _
Public Class Employee
    <DataMember()> _
    Public employeeName As String = Nothing
    <DataMember()> _
    Public employeeID As Integer = 0
    <DataMember(EmitDefaultValue:=False)> _
    Public position As String = Nothing
    <DataMember(EmitDefaultValue:=False)> _
    Public salary As Integer = 0
    <DataMember(EmitDefaultValue:=False)> _
    Public Bonus As Integer = Bonus OrElse Nothing
    <DataMember(EmitDefaultValue:=False)> _
    Public targetSalary As Integer = 57800
End Class

Si se serializa una instancia de esta clase, el resultado es el siguiente: se serializan employeeName y employeeID. El valor null de employeeName y el valor cero para employeeID forma parte explícitamente de los datos serializados. Sin embargo, no se serializan los miembros position, salaryy bonus. Finalmente, se serializa como de costumbre targetSalary, aunque la propiedad EmitDefaultValue esté establecida en false, porque 57800 no coincide con el valor predeterminado de .NET para un entero, que es cero.

Representación de XML

Si el ejemplo anterior se serializa en XML, la representación es similar a la siguiente.

<Employee>  
   <employeeName xsi:nil="true" />  
   <employeeID>0</employeeID>  
<targetSalary>57800</targetSalary>  
</Employee>  

El atributo xsi:nil es un atributo especial en el espacio de nombres de instancia del Esquema XML de World Wide Web Consortium (W3C), que proporciona una manera interoperable de representar explícitamente un valor nulo. Observe que no hay ninguna información en el XML sobre los miembros de datos de bonificaciones, posición ni sueldo. El extremo receptor puede interpretarlos como null, cero y null, respectivamente. No hay ninguna garantía de que un deserializador de otro fabricante pueda realizar la interpretación correcta, que es la razón por la que este patrón no se recomienda. La clase DataContractSerializer siempre selecciona la interpretación correcta de los valores que faltan.

Interacción con IsRequired

Como se analizó en Control de versiones de contrato de datos, el atributo DataMemberAttribute tiene una propiedad IsRequired (el valor predeterminado es false). La propiedad indica si un miembro de datos determinado debe estar presente o no en los datos serializados cuando se deserialicen. Si IsRequired se establece en true (lo que indica que un valor debe estar presente) y EmitDefaultValue se establece en false (lo que indica que el valor no debe estar presente si se establece en su valor predeterminado), no se pueden serializar los valores predeterminados para este miembro de datos porque los resultados serían contradictorios. Si este tipo de miembro de datos está establecido en su valor predeterminado (normalmente null o cero) y se intenta una serialización, se produce una SerializationException.

Representación del esquema

Los detalles de la representación de esquema del lenguaje de definición de esquemas XML (XSD) de los miembros de datos cuando la propiedad EmitDefaultValue está establecida en false se describen en Referencia de esquema de contrato de datos. Sin embargo, la siguiente es una información general resumida:

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

  • El valor predeterminado real a utilizar no se encuentra en el esquema. Depende del punto de conexión receptor el interpretar correctamente un elemento que falta.

En la importación del esquema, la propiedad EmitDefaultValue está establecida automáticamente en false siempre que se detecte la anotación específica de WCF mencionada con anterioridad. También está establecido en false para los tipos de referencia que tengan la propiedad nillable establecida en false para admitir escenarios de interoperabilidad concretos que normalmente tienen lugar al utilizar los servicios web de ASP.NET.

Consulte también