下面的示例显示一个具有公共字段的简单类:
[C#]
public class OrderForm{
public DateTime OrderDate;
}
当将此类的实例序列化时,该实例可能类似于下面这样:
<OrderForm>
<OrderDate>12/12/01</OrderDate>
</OrderForm>
有关序列化的更多示例,请参阅 XML 序列化的示例。
可以序列化的项
使用 XmLSerializer 类,可将下列项序列化。
公共类的公共读/写属性和字段
实现 ICollection 或 IEnumerable 的类(请注意,只序列化集合,不序列化公共属性。)
XmlElement 对象
XmlNode 对象
DataSet 对象
序列化和反序列化对象
若要序列化对象,首先创建要序列化的对象并设置它的公共属性和字段。为此,必须确定要用以存储 XML 流的传输格式(作为流还是作为文件)。例如,如果 XML 流必须以永久形式保存,则创建 FileStream 对象。当您反序列化对象时,传输格式确定您将创建流还是文件对象。确定了传输格式之后,就可以根据需要调用 Serialize 或 Deserialize 方法。
序列化对象
创建对象并设置它的公共字段和属性。
使用该对象的类型构造 XmlSerializer。有关更多信息,请参阅 XmlSerializer 类构造函数。
调用 Serialize 方法以生成对象的公共属性和字段的 XML 流表示形式或文件表示形式。下面的示例创建一个文件。
MySerializableClass myObject = new MySerializableClass();
// Insert code to set properties and fields of the object.
XmlSerializer mySerializer = new
XmlSerializer(typeof(MySerializableClass));
// To write to a file, create a StreamWriter object.
StreamWriter myWriter = new StreamWriter("myFileName.xml");
mySerializer.Serialize(myWriter, myObject);
反序列化对象
使用要反序列化的对象的类型构造 XmlSerializer。
调用 Deserialize 方法以产生该对象的副本。在反序列化时,必须将返回的对象强制转换为原始对象的类型,如下面的示例中所示。下面的示例将该对象反序列化为文件,但是也可以将该对象反序列化为流。
[C#]
MySerializableClass myObject;
// Construct an instance of the XmlSerializer with the type
// of object that is being deserialized.
XmlSerializer mySerializer =
new XmlSerializer(typeof(MySerializableClass));
// To read the file, create a FileStream object.
FileStream myFileStream =
new FileStream("myFileName.xml", FileMode.Open);
// Call the Deserialize method and cast to the object type.
myObject = (MySerializableClass)
mySerializer.Deserialize(myFileStream)
有关 XML 序列化的更多示例,请参阅 XML 序列化的示例。
使用 XML 序列化的好处
XmlSerializer 类在您将对象序列化为 XML 时为您提供完整而灵活的控制。如果您正在创建 XML Web services,则可以将控制序列化的属性应用于类和成员以确保 XML 输出符合特定的架构。
例如,XmlSerializer 使您能够:
指定应将字段或属性编码为特性还是元素。
指定要使用的 XML 命名空间。
如果字段或属性名不合适,则指定元素或特性的名称。
XML 序列化的另一个好处是:只要生成的 XML 流符合给定的架构,则对于所开发的应用程序就没有任何约束。假定有这样一个用于描述图书的架构,它具有标题、作者、出版商和 ISBN 编号元素。您可以开发一个以您所希望的任何方式(例如,作为图书订单,或作为图书清单)处理 XML 数据的应用程序。在任一种情况下,唯一的要求是 XML 流应当符合指定的 XML 架构定义语言 (XSD) 架构。
XML 序列化注意事项
使用 XmlSerializer 类时,应考虑下列情况:
已序列化的数据中仅包含类和数据的形状。不包括类型标识和程序集信息。
只能序列化公共属性和字段。如果需要序列化非公共数据,请使用 BinaryFormatter 类而不是 XML 序列化。
类必须有一个将由 XmlSerializer 序列化的默认构造函数。
不能序列化方法。
XmlSerializer 可以以不同方式处理实现 IEnumerable 或 ICollection 的类(条件是这些类满足某些要求)。实现 IEnumerable 的类必须实现带单个参数的公共 Add 方法。Add 方法的参数必须与从 GetEnumerator 方法返回的 IEnumerator.Current 属性所返回的类型一致(多态)。除实现 IEnumerable 外还实现 ICollection 的类(如 CollectionBase)必须有一个取整数的公共 Item 索引属性(在 C# 中为索引器),并且它必须有一个整数类型的公共 Count 属性。Add 方法的参数必须与从 Item 属性返回的类型相同或与该类型的某个基的类型相同。对于实现 ICollection 的类,要序列化的值将从索引 Item 属性检索,而不是通过调用 GetEnumerator 来检索。另外请注意,除返回另一个集合类(实现 ICollection 的集合类)的公共字段之外,将不序列化公共字段和属性。有关示例,请参阅 XML 序列化的示例。