xsi:nil 特性绑定支持

本主题专门介绍一项旧有技术。现在应通过使用以下链接来创建 XML Web 服务和 XML Web 服务客户端: Windows Communication Foundation.

.NET Framework 为 xsi:nil 特性提供部分绑定支持。

XmlSerializer 类将 xsi:nil="true" 特性值等同于分配给引用类型或分配给可为空值类型的空引用。如果 nil 特性设置为 true,则当 XmlSerializer 试图反序列化不可为空值类型的实例时会引发异常。(有关可空类型的更多信息,请参见Nullable Types (C# Programming Guide))。

说明

nil 特性是在 XML 架构实例命名空间 http://www.w3.org/2001/XMLSchema-instance(通常与前缀 xsi 关联)中定义的,它仅适用于 XML 实例文档,而不适用于 XML 架构文档。XML 元素中 xsi:nil 特性的 true 值显式指定该元素没有任何内容(无论是子元素还是正文文本)。

仅当 XML 元素的 XSD 声明中包含设置为 truenillable 特性时,出现在该 XML 元素中的 nil 特性才有效。有关 .NET Framework 如何确定 nillable="true" 设置适用于与对象相对应的 XML 元素还是与成员相对应的 XML 元素,请参见 nillable 特性。

XmlSerializer 类将 nil 特性的 true 值等同于空引用(在 Visual Basic 中为 Nothing),并执行下列运行时转换:

  • 在将 XML 文档反序列化为对象时:如果 XmlSerializer 类遇到指定 xsi:nil="true" 的 XML 元素,它会将一个空引用(如果适用的话)分配给对应的对象。

  • 在将对象序列化为 XML 文档时:如果 XmlSerializer 类遇到与 XML 元素对应的对象的空引用,它或者生成指定 xsi:nil="true" 的元素,或者完全忽略该元素,具体取决于 nillable="true" 设置是否适用。

nil 特性和不可为空值类型

由于永远不能将不可为空值类型设置为空引用,因此,在将此种类型的类成员映射到 XML 元素声明时,XmlSerializer 类在序列化过程中没有理由来输出对应实例元素的 xsi:nil 特性。

XmlSerializer 类无法对数据类型映射到不可为空值类型并且 nil 特性已设置为 true 的 XML 元素进行反序列化。将 XML 文档反序列化为对象时,如果 XmlSerializer 类遇到这样的元素,它就会发出一个 System.FormatException:“输入字符串的格式不正确”。如果该 XML 文档是由某个 XML 架构实现创建的,并且该实现允许 nil 特性出现在 .NET Framework 绑定到不可为空值类型的架构数据类型的实例中,则可能会出现这种情况。

nil 特性和其他特性

XML 架构规范允许其他 XML 特性出现在 xsi:nil 特性设置为 true 的元素中。由于只有当对应的对象被分配了空引用时,XmlSerializer 类才将 nil 特性设置为 true,因此,表示 XML 特性(通过 System.Xml.Serialization.XmlAttributeAttribute 类型的特性)的任何对象字段此时甚至不能存在于内存中。

因此,XmlSerializer 类按如下方式处理其他特性:

  • 在将对象序列化为 XML 文档时:如果 XmlSerializer 类遇到与某个 XML 元素对应的对象的空引用,并且应当为该元素指定 nil 特性,则它会省略任何其他特性。

  • 在将 XML 文档反序列化为对象时:如果 XmlSerializer 类遇到指定 xsi:nil="true" 的 XML 元素,它会为对应的对象分配一个空引用,并忽略其他任何特性。如果该 XML 文档是由某个 XML 架构实现创建的,而且该实现允许其他特性与 xsi:nil="true" 一起出现(实际上是不将 niltrue 值绑定到空对象引用),则可能会出现这种情况。

字符串类型的无效 nil 特性

请考虑下面的 <element> 声明,它具有为 nillable 特性显式指定的默认 false 值:

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

此元素将绑定到下面的类成员(为 IsNullable 属性显式指定了默认的 false 值):

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

假定某个 XML 实例文档中包含旨在遵循前面的 <element> 声明的以下元素:

<key xsi:nil="true"/>

XmlValidatingReader 类会将此元素识别为无效,因为当 nillable 定义特性的值为 false 时,此元素使用 nil 实例特性。但是,在反序列化此元素时,XmlSerializer 类将不会引发异常,而是会将对应的 key 字段的值设置为空字符串(以 "" 表示)。

**可能的包含元素:**任何实例元素

另请参见

参考

nillable 特性绑定支持