Поделиться через


Поддержка привязки атрибута Xsi:nil

Этот раздел посвящен технологии прежних версий. Веб-службы XML и клиенты веб-служб XML должны создаваться с использованием Windows Communication Foundation.

Платформа .NET Framework обеспечивает частичную поддержку привязки для атрибута xsi:nil.

Класс XmlSerializer приравнивает значение атрибута xsi:nil="true" к пустой ссылке, присвоенной ссылочному типу или типу значения, допускающему значение null. Класс XmlSerializer создает исключение при попытке десериализации экземпляра типа значения, не допускающего значения null, если для атрибута nil задано значение true. (Дополнительные сведения о типах, допускающих значение null, см. в разделе Nullable Types (C# Programming Guide)).

Объяснение

Атрибут nil определен в пространстве имен экземпляра схемы XML, http://www.w3.org/2001/XMLSchema-instance (обычно связанном с префиксом xsi), и применяется только к документам экземпляров XML, но не к документам схем XML. Значение true атрибута xsi:nil элемента XML явно указывает, что у элемента отсутствует содержимое, будь то дочерние элементы или основной текст.

Появление атрибута nil допускается только в тех элементах XML, объявление XSD которых содержит атрибут nillable со значением true. В описании атрибута nillable показано, как платформа .NET Framework определяет, применяется ли параметр nillable="true" к элементу XML, соответствующему объекту или участнику.

Класс XmlSerializer приравнивает значение true атрибута nil к пустой ссылке ("Nothing" в Visual Basic), производя во время выполнения указанные ниже преобразования.

  • При десериализации документа XML в объекты: если класс XmlSerializer встречает элемент XML, в котором указано xsi:nil="true", соответствующему объекту назначается пустая ссылка (если применимо).

  • При сериализации объектов в документ XML: если класс XmlSerializer встречает пустую ссылку для объекта, соответствующего элементу XML, либо создается элемент с параметром xsi:nil="true", либо элемент полностью исключается — это зависит от того, применен ли параметр nillable="true".

Атрибут nil и типы значений, не допускающие значение null

Так как для типа значения, не допускающего значение null, задать пустую ссылку невозможно, то когда участник класса такого типа сопоставляется с объявлением элемента XML, класс XmlSerializer во время сериализации не имеет причин, чтобы выводить атрибут xsi:nil для соответствующего элемента экземпляра.

Класс XmlSerializer не может десериализовать элемент XML, тип данных которого сопоставляется с типом значения, не допускающим значение null, и атрибуту nil которого присвоено значение true. Если при десериализации документа XML в объекты класс XmlSerializer встречает такой элемент, он выдает исключение System.FormatException: "Входная строка имеет неправильный формат". Такая ситуация может возникнуть, если документ XML был создан реализацией схемы XML, допускающей появление атрибута nil в экземплярах типов данных схемы, которые платформа .NET Framework привязывает к типам значений, не допускающим значение null.

Атрибут nil и другие атрибуты

Спецификация схемы XML допускает появление других атрибутов XML в элементе, атрибуту xsi:nil которого присвоено значение true. Так как класс XmlSerializer задает для атрибута nil значение true только в случае, когда соответствующему объекту присвоена пустая ссылка, никакие поля объекта, представляющие атрибуты XML (через атрибут типа System.Xml.Serialization.XmlAttributeAttribute), не могут на этом этапе даже существовать в памяти.

Поэтому класс XmlSerializer обрабатывает дополнительные атрибуты указанным ниже образом.

  • При сериализации объектов в документ XML: если класс XmlSerializer встречает пустую ссылку для объекта, соответствующего элементу XML, для которого должен быть задан атрибут nil, все другие атрибуты опускаются.

  • При десериализации документа XML в объекты: если класс XmlSerializer встречает элемент XML, в котором указано xsi:nil="true", соответствующему объекту назначается пустая ссылка, а все другие атрибуты игнорируются. Такая ситуация может возникнуть, если документ XML был создан реализацией схемы XML, допускающей появление других атрибутов совместно с xsi:nil="true" — фактически не привязывая значение true атрибута nil к пустой ссылке объекта.

Недопустимый атрибут nil для строковых типов

Рассмотрим следующее объявление <element> со значением по умолчанию false, явно заданным для атрибута nillable:

<xsd:element name="key" type="xsd:string" nillable="false" />

Этот элемент будет привязан к следующему участнику класса (значение по умолчанию false явно присвоено свойству IsNullable):

[System.Xml.Serialization.XmlElementAttribute(IsNullable=false)]
public string key;

Предположим, что XML-документ экземпляра содержит следующий элемент, который должен соответствовать предыдущему объявлению <element>:

<key xsi:nil="true"/>

Класс XmlValidatingReader распознает этот элемент как недопустимый, так как он использует атрибут экземпляра nil, а для значения атрибута определения nillable задано значение false. Однако класс XmlSerializer не вызовет исключение при десериализации этого элемента; вместо этого для значения соответствующего поля key будет задана пустая строка в виде "".

Возможные содержащие элементы: любой элемент экземпляра.

См. также

Справочник

Поддержка привязки атрибута Nillable