Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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 conveniente omitir un atributo de datos de los datos serializados cuando se establece en su valor predeterminado. Dado que el miembro tiene un valor predeterminado, no es necesario serializar un valor real; esto tiene una ventaja de rendimiento.
Para omitir un miembro de los datos serializados, establezca la EmitDefaultValue propiedad del DataMemberAttribute atributo en false
(el valor predeterminado es true
).
Nota:
Debe establecer la propiedad EmitDefaultValue en false
si hay una necesidad específica de hacerlo, como para la interoperabilidad o la reducción del tamaño de los datos.
Ejemplo
El código siguiente 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: employeeName
y employeeID
se serializa. El valor NULL para employeeName
y el valor cero para employeeID
son parte explícita de los datos serializados. Sin embargo, los miembros position
, salary
y bonus
no están serializados. Por último, targetSalary
se serializa como de costumbre, aunque la EmitDefaultValue propiedad está establecida en false
, porque 57800 no coincide con el valor predeterminado de .NET para un entero, que es cero.
Representación 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 xsi:nil
atributo es un atributo especial en el espacio de nombres del esquema XML de World Wide Web Consortium (W3C) que proporciona una manera interoperable de representar explícitamente un valor NULL. Tenga en cuenta que el XML no contiene ninguna información sobre los atributos de datos de posición, salario y bonificación. El extremo receptor puede interpretarlos como null
, cero y null
, respectivamente. No hay ninguna garantía de que un deserializador de terceros pueda realizar la interpretación correcta, por lo que no se recomienda este patrón. La DataContractSerializer clase 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 en los datos serializados cuando se deserializa. Si IsRequired
se establece en , (que indica que un valor debe estar presente) y true
se establece EmitDefaultValue en (lo que indica que el valor no debe estar presente si está establecido false
en su valor predeterminado), los valores predeterminados para este miembro de datos no se pueden serializar 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 de esquema
Los detalles de la representación del esquema del lenguaje de definición de esquemas XML (XSD) para los elementos de datos cuando la propiedad EmitDefaultValue
se establece en false
se describen en el documento Referencia del esquema del contrato de datos. Sin embargo, a continuación se muestra una breve introducción:
Cuando EmitDefaultValue se establece 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 concreto, el atributo "predeterminado" del esquema no se usa para este propósito, elminOccurs
atributo solo se ve afectado por la IsRequired configuración y elnillable
atributo solo se ve afectado por el tipo del miembro de datos.El valor predeterminado real que se va a usar no está presente en el esquema. Corresponde al punto de conexión receptor interpretar adecuadamente un elemento ausente.
En la importación de esquemas, la EmitDefaultValue propiedad se establece false
automáticamente en cada vez que se detecta la anotación específica de WCF mencionada anteriormente. También se establece false
para los tipos de referencia cuya propiedad nillable
está establecida en false
para admitir escenarios específicos de interoperabilidad que suelen ocurrir al consumir servicios web de ASP.NET.