共用方式為


Xsi:nil 屬性繫結支援

.NET Framework 會提供 xsi:nil 屬性的部分繫結支援。

XmlSerializer 類別等同於具有 null 參考的 xsi:nil="true" 屬性值,該 null 參考已指派至參考型別 (Reference Type) 或可為 Null 的實值型別 (Value Type)。如果 nil 屬性設定為 true,則當 XmlSerializer 嘗試還原序列化不可為 Null 的實值型別 (Value Type) 的執行個體時,會擲回例外狀況 (如需可為 Null 的型別的詳細資訊,請參閱Nullable Types (C# Programming Guide))。

說明

nil 屬性定義於 XML 結構描述執行個體命名空間 http://www.w3.org/2001/XMLSchema-instance (通常與前置詞 xsi 相關),並且只會套用至 XML 執行個體文件,而非 XML 結構描述文件。在 XML 項目中,xsi:nil 屬性的 true 值會明確地指定項目缺少內容,無論是子項目或本文都一樣。

只有在 XML 項目的 XSD 宣告包含設定為 truenillable 屬性的情況下,nil 屬性才能有效地顯示在 XML 項目中。如需 .NET Framework 如何判斷 nillable="true" 設定是否套用至對應於物件或成員之 XML 項目的資訊,請參閱 nillable 屬性。

XmlSerializer 類別相當於具有 null 參考之 nil 屬性的 true 值 (在 Visual Basic 中為 Nothing),兩者都會執行下列執行階段轉換:

  • 將 XML 文件還原序列化為物件:如果 XmlSerializer 類別遇到指定 xsi:nil="true" 的 XML 項目,則會將 null 參考 (如果適用) 指派至對應的物件。

  • 將物件序列化為 XML 文件:如果 XmlSerializer 類別遇到對應至 XML 項目之物件的 null 參考,則它會視是否套用 nillable="true" 設定,來產生會指定 xsi:nil="true" 的項目,或是將項目全部省略。

nil 屬性和不可為 null 的實值型別

由於不可為 null 的實值型別絕不會設定為 null 參考,因此,當此型別的類別成員對應到 XML 項目宣告時,XmlSerializer 類別在序列化期間就沒有理由針對對應的執行個體項目輸出 xsi:nil 屬性。

XmlSerializer 類別無法將兩種 XML 項目還原序列化,一種是資料型別對應到不可為 null 實值型別的 XML 項目,另一種則是 nil 屬性已設定為 true 的 XML 項目。將 XML 文件還原序列化為物件時,如果 XmlSerializer 類別遇到這類項目,則會發出 System.FormatException:「輸入字串格式不正確」。如果 XML 結構描述建立了 XML 文件,而該實作允許 nil 屬性出現在結構描述資料型別的執行個體中,且 .NET Framework 將該結構描述資料型別繫結至不可為 null 的實值型別,就會引發這種情況。

nil 屬性和其他屬性

XML 結構描述規格允許其他 XML 屬性出現在 xsi:nil 屬性已設定為 true 的項目中。由於只有當已指派 null 參考給對應物件時,XmlSerializer 類別才會將 nil 屬性設定為 true,因此在那時候,任何表示 XML 屬性的物件欄位 (透過型別 System.Xml.Serialization.XmlAttributeAttribute 的屬性) 甚至都不能存在記憶體中。

所以 XmlSerializer 類別會如下所示處理其他屬性:

  • 將物件序列化為 XML 文件:如果 XmlSerializer 類別遇到物件的 null 參考,而該物件對應到應該指定 nil 屬性的 XML 項目,則會省略任何其他屬性。

  • 將 XML 文件還原序列化為物件:如果 XmlSerializer 類別遇到指定 xsi:nil="true" 的 XML 項目,則會將 null 參考指派至對應的物件,並且會忽略任何其他屬性。如果允許其他屬性與 xsi:nil="true" 一起出現的 XML 結構描述實作已建立 XML 文件,也就是未有效地將 niltrue 值繫結至 null 物件參考,就會引發這種情況。

字串型別的無效 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"/>

nillable 定義屬性的值為 false 時,由於此項目使用 nil 執行個體屬性,因此 XmlValidatingReader 類別會將此項目辨識為無效。然而,還原序列化此項目時,XmlSerializer 類別不會擲回例外狀況,而是會將對應的 key 欄位值設定為空字串,以 "" 表示。

可能包含項目:任何執行個體項目

請參閱

參考

Nillable 屬性繫結支援

Footer image

Copyright © 2007 by Microsoft Corporation. All rights reserved.