Xsi:nil 屬性繫結支援
本主題專門說明舊有技術。 應該使用下列建立 XML Web Service 及 XML Web Service 用戶端: Windows Communication Foundation.
.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 宣告包含設定為 true
的 nillable 屬性的情況下,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 文件,也就是未有效地將 nil 的true
值繫結至 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
欄位值設定為空字串,以 ""
表示。
可能包含項目:任何執行個體項目