属性可用于控制对象的 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>.
如果希望为元素指定一个新名称,这一默认行为是可以改变的。下面的代码显示特性如何通过设置 XmlElementAttribute 的 ElementName 属性来实现这一点。
Public Class TaxRates
< XmlElement(ElementName = "TaxRate")> _
Public ReturnTaxRate As Decimal
End Class
public class TaxRates{
[XmlElement(ElementName = "TaxRate")]
public decimal ReturnTaxRate;
}
有关属性的更多信息,请参见利用属性扩展元数据。有关控制 XML 序列化的属性的列表,请参见控制 XML 序列化的属性。
控制数组序列化
XmlArrayAttribute 和 XmlArrayItemAttribute 属性专门用于控制数组的序列化。使用这些属性,可以控制元素名、命名空间和 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 控制类的序列化
有两个属性可应用于一个类(并且只能是一个类):XmlRootAttribute 和 XmlTypeAttribute。这两个属性非常相似。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 流指定一个备用元素名
如何:将对象序列化
如何:将对象反序列化