微软在 .NET Framework 中通过System.Runtime.Serialization和System.Xml.Serialization提供了序列化功能,从这里我们可以看到微软已经承认了持久化数据的需要。System.Runtime.Serialization提供了开发自定义序列化解决方案的框架。System.XML.Serialization命名空间提供了以 XML 持久化对象的基本功能。下面让我们近距离看一下如何使用这一方法。
XML 的普通要求
XML 序列化是将一个对象的公有属性(property)和域(field)转换到一个序列化格式(在这里是 XML)用于存储或传输的过程。反序列化是从 XML 输出中按照对象的原始状态重新创建对象的过程。因此,你可以将序列化看作是一种将对象状态保存到一个流或缓冲区的方法。
序列的两个常用的地方是数据持久化和数据交换。持久化指在用户的会话间保存数据的过程。当应用程序关闭时数据被存储(序列化),当用户回来时数据被重新装载(反序列化)。数据交换是将数据提供其它系统的过程。使用序列化和 XML 可以很简单地实现数据交换。
对象中的数据在编程语句结构中被描述为类(class)、域(field)、属性(property)、基元类型(primitive type)、数组(array),甚至是以System.Xml.XmlElement或System.Xml.XmlAttribute形式出现的内嵌 XML。
System.Xml.Serialization命名空间的中心类是XmlSerializer。它还包含处理 XML 的各个方面的类以及使用 SOAP 的类,但是XmlSerializer是我们关注的焦点。
XmlSerializer
XmlSerializer类允许你将数据序列化到 XML 文档并从 XML 文档反序列化对象。它能够使你控制对象如何被编码到 XML。其类构造器接受对象类型作为参数以进行序列化。下面的 C# 代码展示了如何使用构建器:
XmlSerializer ser = new XmlSerializer(typeof(objectToSerialize));
下面是对应的 VB.NET 代码:
Dim ser As New XmlSerializer(GetType(objectToSerialize))
实际的序列化过程是由XmlSerializer类的Serialize 方法完成的。这个方法有六个签名,这些签名允许你在序列化过程中使用TextWriter、Stream 和XmlWriter对象。下面的示例代码展示了如何使用这个方法。该例将一个对象序列化到本地磁盘驱动器上的一个文件中。下面首先列出的是使用类的代码,然后是实际的序列化代码:
using System;
namespace BuilderSerialization {
public class Address {
public Address() {}
public string Address1;
public string Address2;
public string City;
public string State;
public string Zip;
public string Country;
} }
using System;
namespace BuilderSerialization {
public class Author {
public Author() { }
public string FirstName;
public string MiddleName;
public string LastName;
public string Title;
public string Gender;
public Address AddressObject;
} }
namespace BuilderSerialization {
public class Book {
public Book() { }
public string Title;
public Author AuthorObject;
public string ISBN;
public double RetailPrice;
public string Publisher;
}}
using System;
using System.Xml.Serialization;
using System.IO;
namespace BuilderSerialization {
class TestClass {
static void Main(string[] args) {
Book BookObject = new Book();
XmlSerializer ser = new XmlSerializer(typeof(Book));
TextWriter writer = new StreamWriter("booktest.xml");
BookObject.Title = "Practical LotusScript";
BookObject.ISBN = "1884777767 ";
BookObject.Publisher = "Manning Publications";
BookObject.RetailPrice = 43.95;
BookObject.AuthorObject = new Author();
BookObject.AuthorObject.FirstName = "Tony";
BookObject.AuthorObject.LastName = "Patton";
BookObject.AuthorObject.Gender = "Male";
BookObject.AuthorObject.AddressObject = new Address();
BookObject.AuthorObject.AddressObject.Address1 = "1 Main Street";
BookObject.AuthorObject.AddressObject.City = "Anywhere";
BookObject.AuthorObject.AddressObject.State = "KY";
BookObject.AuthorObject.AddressObject.Zip = "40000";
BookObject.AuthorObject.AddressObject.Country = "USA";
ser.Serialize(writer, BookObject);
writer.Close();
} } }