共用方式為


使用屬性控制 XML 序列化

屬性可用來控制物件的 XML 序列化,或是從同樣一組類別建立其他 XML 資料流。如需建立其他 XML 資料流的詳細資訊,請參閱覆寫 XML 序列化

**注意   **如果產生的 XML 必須與標題為<Simple Object Access Protocol (SOAP) 1.1>的全球資訊網協會 (www.w3.org) 文件第五節相符,則請使用列於控制編碼 SOAP 序列化的屬性中的屬性。

依預設,XML 項目名稱是由類別或成員名稱決定。在名為 Book 的簡單類別中,名為 ISBN 的欄位會產生 XML 項目標記 <ISBN>,如下列範例所示。

Public Class Book
    Public ISBN As String
End Class
' When an instance of the Book class is serialized, it might 
' produce this XML:
' <ISBN>1234567890</ISBN>.
[C#]
public class Book
{
    public string ISBN;
}
// When an instance of the Book class is serialized, it might 
// produce this XML:
// <ISBN>1234567890</ISBN>.

如果您想為項目指定新的名稱,則可以變更這個預設行為。下列程式碼將說明屬性如何藉由設定 XmlElementAttributeElementName 屬性來這麼做。

Public Class TaxRates
   < XmlElement(ElementName = "TaxRate")> _
    Public ReturnTaxRate As Decimal
End Class
[C#]
public class TaxRates{
    [XmlElement(ElementName = "TaxRate")]
    public decimal ReturnTaxRate;
}

如需屬性的詳細資訊,請參閱使用屬性 (Attribute) 擴充中繼資料。如需控制 XML 序列化的屬性清單,請參閱控制序列化的屬性

若要使用屬性控制序列化

  1. 將任一特殊屬性套用至類別或類別成員。如需控制序列化的特定屬性清單,請參閱控制序列化的屬性
  2. 視需要修改類別的成員。例如,變更成員的名稱,但請將 ElementName 屬性設定為適當值,也就是設定為與序列化物件的 XML 結構描述 (XSD) 相符的值。
  3. 序列化或還原序列化類別執行個體。

產生的 XML 資料流會與結構描述相符,但類別會具有人們可讀取的 (Human-Readable) 方法名稱。

控制陣列序列化

XmlArrayAttributeXmlArrayItemAttribute 屬性是設計來控制陣列的序列化。您可使用這些屬性來控制元素名稱、命名空間和 XML 結構描述 (XSD) 資料型別,(如標題為<XML Schema Part2: Datatypes>的全球資訊網協會 [www.w3.org] 文件中的定義)。您也可指定可包含在陣列中的型別。

XmlArrayAttribute 會決定封入 XML 元素 (當序列化陣列時產生的) 的屬性。例如,依預設,序列化下面的陣列會產生名為「Employees」的 XML 元素。Employees 元素會包含依陣列型別 (Array Type)「Employee」命名的一系列元素。

Public Class Group
    Public Employees() As Employee
End Class
Public Class Employee
    Public Name As String;
End Class
[C#]
public class Group{
    public Employee[] Employees;
}
public class Employee{
    public string Name;
}

序列化的執行個體可能像這樣。

<Group>
<Employees>
    <Employee>
        <Name>Haley</Name>
    </Employee>
</Employees >
</Group>

您可套用 XmlArrayAttribute 來變更 XML 元素的名稱,如下所示。

Public Class Group
    <XmlArray("TeamMembers")> _
    Public Employees() As Employee
End Class
[C#]
public class Group{
    [XmlArray("TeamMembers")]
    public Employee[] Employees;
}

產生的 XML 可能像這樣。

<Group>
<TeamMembers>
    <Employee>
        <Name>Haley</Name>
    </Employee>
</TeamMembers>

相反地,XmlArrayItemAttribute 則會控制如何序列化包含在陣列中的項目。請注意,在下列範例中,屬性是套用至傳回陣列的資料行。

Public Class Group
    <XmlArray("MemberName")> _
    Public Employee() As Employees
End Class
[C#]
public class Group{
    [XmlArrayItem("MemberName")]
    public Employee[] Employees;
}

產生的 XML 可能像這樣。

<Group>
<Employees>
    <MemberName>Haley</MemberName>
</Employees>
</Group>

序列化衍生類別

XmlArrayItemAttribute 的另一用途是可序列化衍生類別 (Derived Class)。例如,您可在先前範例中加入衍生自 Employee 的另一個類別 Manager。如果您未套用 XmlArrayItemAttribute,則程式碼在 Run Time 會失敗,因為無法辨認衍生類別型別。若要解決這個問題,請套用屬性兩次,每次為每種可接受的型別 (基底和衍生型別) 設定 XmlArrayItemAttribute.Type 屬性。

Public Class Group
    <XmlArrayItem(Type:=GetType(Employee)), _
    XmlArrayItem(Type:=GetType(Manager))> _
    Public Employees() As Employee
End Class
Public Class Employee
    Public Name As String;
End Class
Public Class Manager
Inherits Employee
    Public Level As Integer
End Class
[C#]
public class Group{
    [XmlArrayItem(Type = typeof(Employee)),
    XmlArrayItem(Type = typeof(Manager))]
    public Employee[] Employees;
}
public class Employee{
    public string Name;
}
public class Manager:Employee{
    public int Level;
}

序列化的執行個體可能像這樣。

<Group>
<Employees>
    <Employee>
        <Name>Haley</Name>
    </Employee>
    <Employee xsi:type = "Manager">
        <Name>Ann</Name>
        <Level>3</Level>
    <Employee>
</Employees >
</Group>

將陣列序列化為一系列項目

您也可藉由將 XmlElementAttribute 套用至傳回陣列的欄位,將陣列序列化為「一般的」一系列 XML 項目,如下所示。

Public Class Group
    <XmlElement> _
    Public Employees() As Employee
End Class
[C#]
public class Group{
    [XmlElement]
    public Employee[] Employees;
}

序列化的執行個體可能像這樣。

<Group>
<Employees>
    <Name>Haley</Name>
</Employees>
<Employees>
    <Name>Noriko</Name>
</Employees>
<Employees>
    <Name>Marco</Name>
</Employees>
</Group>

另一個區分兩個 XML 資料流的方法是使用 XML 結構描述定義工具,從編譯程式碼產生 XML 結構描述 (XSD) 文件檔案 (如需使用工具的詳細資訊,請參閱 XML 結構描述定義工具和 XML 序列化)。當未將任何屬性套用至欄位時,結構描述會以下列方式描述項目。

<xs:element minOccurs="0" maxOccurs ="1" name="Employees" type="ArrayOfEmployee" />

當將 XmlElementAttribute 套用至欄位時,產生的結構描述則會描述項目如下。

<xs:element minOccurs="0" maxOccurs="unbounded" name="Employees" type="Employee" /> 

序列化 ArrayList

ArrayList 類別可包含不同物件的集合。因此您可用和陣列一樣的使用方法來使用 ArrayList。您不需要建立傳回型別物件陣列的欄位,而可建立傳回單一 ArrayList 的欄位。然而,和陣列一樣,您必須通知 ArrayList 包含的物件型別的 XmlSerializer。若要這麼做,請將 XmlElementAttribute 的多個執行個體指派給欄位,如下列範例所示。

Public Class Group
    <XmlElement(Type:=GetType(Employee)), _
    XmlElement(Type:=GetType(Manager))> _
    Public Info As ArrayList
End Class
[C#]
public class Group{
    [XmlElement(Type = typeof(Employee)), 
    XmlElement(Type = typeof(Manager))]
    public ArrayList Info;
}

使用 XmlRootAttribute 和 XmlTypeAttribute 控制類別的序列化

可套用至類別 (只限一個類別) 的屬性有二:XmlRootAttributeXmlTypeAttribute。這兩個屬性非常類似。您只能將 XmlRootAttribute 套用至一個類別:這個類別就是在序列化時表示 XML 文件的開頭和結尾項目,也就是「根」項目。相反地,您可將 XmlTypeAttribute 套用至任何類別,包括根 (Root) 類別。

例如,在先前範例中,Group 類別是根類別,而且它的所有公用欄位和屬性都成為在 XML 文件中找到的 XML 項目。因此只可以有一個根類別。藉由套用 XmlRootAttribute,您可控制由 XmlSerializer 產生的 XML 資料流。例如,您可變更項目名稱和命名空間。

XmlTypeAttribute 可讓您控制所產生 XML 的結構描述。當您需要透過 XML Web Service 發行結構描述時,這個功能會相當有用。下列範例會將 XmlTypeAttributeXmlRootAttribute 兩者套用至相同的類別。

<XmlRoot("NewGroupName"), _
XmlType("NewTypeName")> _
Public Class Group
    Public Employees() As Employee
End Class
[C#]
[XmlRoot("NewGroupName")]
[XmlType("NewTypeName")]
public class Group{
    public Employee[] Employees;
}

如果編譯這個類別,並使用 XML 結構描述定義工具來產生它的結構描述,您會找到下列描述 Group 的 XML。

<xs:element name="NewGroupName" type="NewTypeName">

相反地,如果您是序列化類別的執行個體,則 XML 文件中只會找到 NewGroupName

<NewGroupName>
    . . .
</NewGroupName>

使用 XmlIgnoreAttribute 防止序列化

某些情況下,欄位的公用屬性可能不需要序列化。例如,欄位或屬性可用來包含中繼資料 (Metadata)。在這種情況下,將 XmlIgnoreAttribute 套用至欄位或屬性,XmlSerializer 就會略過它。

請參閱

控制 XML 序列化的屬性 | 控制編碼 SOAP 序列化的屬性 | XML 序列化簡介 | XML 序列化的範例 | 覆寫 XML 序列化