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
, 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 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 atributominOccurs
solo se ve afectado por el valor IsRequired, y el atributonillable
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.