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: |
---|
No se recomienda establecer la propiedad EmitDefaultValue en false. Solo debe hacerse esto 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 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
[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;
}
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
, salary
y 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 modelo no se recomienda. La clase DataContractSerializer siempre selecciona la interpretación correcta de los valores que faltan.
Interacción con IsRequired
Como se discutió en Versiones de contratos 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 miembros de datos cuando la propiedad EmitDefaultValue está establecida en false se discuten en Referencia de esquema de contrato de datos. Sin embargo, la siguiente es una información general resumida:
Cuando el EmitDefaultValue está establecido en false, se representa en el esquema como una anotación específica para 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 extremo 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.