Compatibilidad con enlaces del atributo Xsi:nil
Este tema es específico de una tecnología heredada. Ahora, los servicios Web XML y los clientes de servicios Web XML deben crearse con Windows Communication Foundation.
.NET Framework proporciona compatibilidad con enlace parcial para el atributo xsi:nil.
La clase XmlSerializer corresponde a un valor de atributo xsi:nil="true"
con una referencia nula asignada a un tipo de referencia o a un tipo de valor que acepta valores NULL. XmlSerializer genera una excepción cuando intenta deserializar una instancia de un tipo de valor que no acepta valores NULL si el valor del atributo nil está establecido en true
. (Para obtener más información sobre los tipos que aceptan valores NULL, vea Nullable Types (C# Programming Guide).)
Explicación
El atributo nil aparece definido en el espacio de nombres de instancia del esquema XML, http://www.w3.org/2001/XMLSchema-instance (normalmente asociado al prefijo xsi), y solo se aplica a documentos de instancia XML, no a documentos de esquema XML. Un valor true
para el atributo xsi:nil en un elemento XML especifica explícitamente que el elemento no tiene contenido, tanto si se trata de elementos secundarios como de texto propiamente dicho.
Un atributo nil solo puede aparecer como válido en un elemento XML cuya declaración XSD contiene un atributo nillable establecido en true
. Consulte el atributo nillable para obtener información sobre cómo .NET Framework determina si un valor de configuración nillable="true"
se aplica a un elemento XML que corresponde a un objeto o miembro.
La clase XmlSerializer iguala un valor true
para el atributo nil con una referencia nula (Nada en Visual Basic), realizando las siguientes conversiones en tiempo de ejecución:
Al deserializar un documento XML en objetos: si la clase XmlSerializer encuentra un elemento XML que especifica
xsi:nil="true"
, asigna una referencia nula (si es aplicable) al objeto correspondiente.Al serializar objetos en un documento XML: si la clase XmlSerializer encuentra una referencia nula para un objeto que corresponde a un elemento XML, bien genera un elemento que especifica
xsi:nil="true"
o deja el elemento fuera por completo, dependiendo de si se aplica un valor de configuraciónnillable="true"
.
Atributo nil y tipos de valor que no aceptan valores NULL
Dado que un tipo de valor que no acepta valores NULL nunca puede establecerse en una referencia nula, cuando el miembro de una clase de ese tipo se asigna a la declaración de un elemento XML, la clase XmlSerializer no tiene ninguna razón durante la serialización para devolver como resultado el atributo xsi:nil para el elemento de instancia correspondiente.
La clase XmlSerializer no puede deserializar un elemento XML cuyo tipo de datos se asigne a un tipo de valor que no acepta valores NULL y cuyo atributo nil se haya establecido en true
. Al deserializar un documento XML en objetos, si la clase XmlSerializer encuentra un elemento de ese tipo, emitirá una System.FormatException: "La cadena de entrada no tiene el formato correcto". Esta situación puede producirse si el documento XML ha sido creado por una implementación de esquema XML que permite que el atributo nil aparezca en instancias de tipos de datos de esquema que .NET Framework enlaza a tipos de valor que no aceptan valores NULL.
El atributo nil y otros atributos
La especificación de esquema XML permite a otros atributos XML aparecer en un elemento cuyo atributo xsi:nil se haya establecido en true
. Debido a que la única vez que la clase XmlSerializer establece el atributo nil en true
tiene lugar cuando el objeto correspondiente se asigna a una referencia nula, ningún campo de objetos que represente atributos XML (mediante un atributo de tipo System.Xml.Serialization.XmlAttributeAttribute) podría existir en memoria llegados a ese punto.
Por consiguiente, la clase XmlSerializer trata atributos adicionales de la siguiente manera:
Al serializar objetos en un documento XML: si la clase XmlSerializer encuentra una referencia nula para un objeto correspondiente a un elemento XML para el cual debería especificarse el atributo nil, se omite cualquier otro atributo.
Al deserializar un documento XML en objetos: si la clase XmlSerializer encuentra un elemento XML que especifica
xsi:nil="true"
, asigna una referencia nula al objeto correspondiente y omite cualquier otro atributo. Esta situación puede surgir si el documento XML ha sido creado mediante una implementación de esquema XML que hace posible que aparezcan otros atributos junto conxsi:nil="true"
(no estableciéndose enlaces entre un valor nil detrue
y una referencia de objeto nula.
Atributo nil no válido para tipos de cadena
Tenga en cuenta la siguiente declaración**<element>** con el valor predeterminado false
explícitamente especificado para el atributo nillable:
<xsd:element name="key" type="xsd:string" nillable="false" />
Este elemento establecería enlaces con el siguiente miembro de clase (el valor predeterminado false
se especifica explícitamente para la propiedad IsNullable):
[System.Xml.Serialization.XmlElementAttribute(IsNullable=false)]
public string key;
Imaginemos que un documento de instancia XML contiene el siguiente elemento para adaptarse a la declaración <element> precedente:
<key xsi:nil="true"/>
La clase XmlValidatingReader reconocería este elemento como no válido porque utiliza un atributo de instancia nil cuando el valor del atributo de definición nillable es false
. Sin embargo, la clase XmlSerializer no produciría una excepción durante la deserialización de este elemento; en su lugar, establecería el correspondiente valor de campo key
en una cadena vacía expresada con ""
.
Posibles elementos contenedores: cualquier elemento de instancia