本主题专门介绍一项旧有技术。现在应通过使用以下链接来创建 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 声明中包含设置为 true
的 nillable 特性时,出现在该 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"
一起出现(实际上是不将 nil 的true
值绑定到空对象引用),则可能会出现这种情况。
字符串类型的无效 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
字段的值设置为空字符串(以 ""
表示)。
**可能的包含元素:**任何实例元素