共用方式為


使用屬性控制 XML 序列化

屬性可用來控制物件的 XML 序列化,或從同一組類別建立替代的 XML 串流。 欲了解更多關於建立替代 XML 串流的資訊,請參閱 「如何:為 XML 串流指定替代元素名稱」。

備註

若產生的 XML 必須符合萬維網聯盟(W3C)文件第 5 節,標題為 Simple Object Access Protocol (SOAP) 1.1,請使用 控制編碼的 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>.
public class Book
{
    public string ISBN;
}
// When an instance of the Book class is serialized, it might
// produce this XML:
// <ISBN>1234567890</ISBN>.

預設行為可以更改,如果你想給元素取新名稱。 以下程式碼說明屬性如何透過設定 ElementNameXmlElementAttribute屬性來實現此功能:

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

欲了解更多屬性資訊,請參閱屬性。 關於控制 XML 序列化的屬性列表,請參見 控制 XML 序列化的屬性

控制陣列序列化

屬性XmlArrayAttributeXmlArrayItemAttribute控制陣列的序列化。 利用這些屬性,你可以控制元素名稱、命名空間及 XML Schema(XSD)資料型別,這些定義見 W3C 文件《 XML Schema Part 2: Datatypes》。 你也可以指定可以包含在陣列中的類型。

XmlArrayAttribute 將決定序列化陣列時所生成的封裝 XML 元素的屬性。 例如,預設情況下,序列化下方陣列會產生一個名為 Employees的 XML 元素。 該 Employees 元素將包含一系列以陣列類型 Employee命名的元素。

Public Class Group
    Public Employees() As Employee
End Class
Public Class Employee
    Public Name As String
End Class
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
public class Group {
    [XmlArray("TeamMembers")]
    public Employee[] Employees;
}

最終產生的 XML 可能類似以下程式碼:

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

另一方面,則 XmlArrayItemAttribute控制陣列中項目的序列化方式。

備註

屬性會套用到回傳陣列的欄位。

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

最終產生的 XML 可能類似以下程式碼:

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

派生類別的序列化

另一個用途 XmlArrayItemAttribute 是允許導出類別的序列化。 例如,可以在之前的範例中新增另一個名為Manager的類別,此類別是從Employee衍生出來的。 如果你不套用 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
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>

將陣列序列化為元素序列

你也可以將陣列序列化為一串扁平的 XML 元素,方法是對欄位套用 a XmlElementAttribute 並回傳陣列,方法如下:

Public Class Group
    <XmlElement> _
    Public Employees() As Employee
End Class
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 Schema 定義工具,從編譯後的程式碼產生 XML Schema(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的欄位。 不過,和陣列一樣,您必須指定XmlSerializerArrayList所包含的物件類型。 為達成此目標,請將多個 實例 XmlElementAttribute 指派到該欄位,如下範例所示。

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

使用 XmlRootAttribute 與 XmlTypeAttribute 控制類別序列化

你只能對一個類別套用兩個屬性: XmlRootAttributeXmlTypeAttribute。 這些特質相似。 該類別 XmlRootAttribute 只能套用於一個類別:序列化後代表 XML 文件開頭與結尾元素的類別——換句話說,就是根元素。 XmlTypeAttribute另一方面,可以套用到任何類別,包括根類別。

例如,在前述範例中,該 Group 類別是根類別,其所有公用欄位與屬性都成為 XML 文件中所發現的 XML 元素。 因此,你只能有一個根類別。 透過套用 XmlRootAttribute,你可以控制由 XmlSerializer產生的 XML 串流。 例如,你可以更改元素名稱和命名空間。

XmlTypeAttribute 讓你能控制產生的 XML 的結構。 此功能在需要透過 XML Web 服務發布結構時非常有用。 以下範例將XmlTypeAttributeXmlRootAttribute同時應用於同一類別:

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

如果將此類別編譯完成,並使用 XML Schema Definition 工具產生其結構,你會看到以下 XML Group描述:

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

相較之下,若你序列化這個類別的實例,在 XML 文件中只會找到 NewGroupName

<NewGroupName>
    . . .
</NewGroupName>

防止使用 XmlIgnoreAttribute 進行序列化

你可能會遇到公共財產或田地不需要序列號的情況。 例如,欄位或屬性可以用來包含元資料。 在這種情況下,將XmlIgnoreAttribute應用於該欄位或屬性,然後XmlSerializer就會跳過它。

另請參閱