使用属性控制 XML 序列化

属性可用于控制对象的 XML 序列化,或者从同一组类创建备用的 XML 流。有关创建备用 XML 流的详细信息,请参见如何:为 XML 流指定一个备用元素名

备注

如果生成的 XML 必须符合标题为“Simple Object Access Protocol (SOAP) 1.1”的万维网联合会 (www.w3.org) 文档的第 5 节,则使用控制编码的 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>.

如果希望为元素指定一个新名称,这一默认行为是可以改变的。下面的代码显示特性如何通过设置 XmlElementAttributeElementName 属性来实现这一点。

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 架构 (XSD) 数据类型(在标题为“XML Schema Part 2: Datatypes”的万维网联合会 [www.w3.org] 文档中定义)。还可指定可包含在数组中的类型。

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>

另一方面,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 的另一种用途是序列化派生类。例如,可将从 Employee 派生的、名为 Manager 的另一个类添加到上一个示例。如果不应用 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>

将数组序列化为元素序列

通过将 XmlElementAttribute 应用于返回数组的字段,还可以将该数组序列化为平面的 XML 元素序列,如下所示。

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 架构定义工具从编译了的代码生成 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
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 服务发布架构时,此功能很有用。下面的示例将 XmlTypeAttribute 和 XmlRootAttribute 两者应用于同一个类。

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

如果编译此类,并且将 XML 架构定义工具用于生成此类的架构,您将发现描述 Group 的如下 XML。

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

相反,如果要序列化该类的实例,在 XML 文档中将仅发现 NewGroupName

<NewGroupName>
    . . .
</NewGroupName>

使用 XmlIgnoreAttribute 防止序列化

有时候可能不需要序列化公共属性或字段。例如,字段或属性可能被用于包含元数据。在此情况下,请将 XmlIgnoreAttribute 应用于该字段或属性,XmlSerializer 就会跳过它。

请参见

任务

如何:为 XML 流指定一个备用元素名
如何:将对象序列化
如何:将对象反序列化

概念

控制 XML 序列化的属性
控制编码的 SOAP 序列化的属性
介绍 XML 序列化
XML 序列化的示例