技术开发 频道

.Net高级编程之序列化


【IT168专稿】 

    序列化这个东西,从很久以前就诞生了,以前很多编程语言中都有它的身影。所谓序列化,无非就是将程序内存中的数据,按照一定的组织形式,转化为顺序而连续的数据,以方便于网络传输和存储。随着XML的广泛应用,又出现了将数据转化为xml文档格式的序列化,我们这里称之为XML序列化。

本文中,将要讲述.Net编程中的普通序列化和XML序列化功能。其实对于.Net,有两种序列化方式:

1) 使用平台本身提供的自动序列化功能,此功能并不需要被序列化的类型实现任何接口或者编写任何更多的附加代码。
2) 通过实现接口来自定义序列化功能,在接口方法中写入代码来实现序列化。

    反射(Reflection)是.Net一个伟大的创举,这让我们的代码变得更加“智能”,它的出现也使得自动序列化变得可能。其实在大多数情况下,我们使用自动序列化已经足够满足我们的需求,但是可能在某些特殊情况下,我们需要实现相关的接口来完成自定义的序列化功能。

序列化是如何工作的

    为了让对序列化这个概念并不熟悉的读者有一个具体的认识,我写了下面的代码来演示一个使用序列化的程序如何工作的。
[Serializable]//该标签表示User类型可序列化 
class User
{
public string name;
public int age;
public override string ToString()
{
return "Name: " + name + "\tAge: " + age.ToString();
}
}
static void Main(string[] args)
{
//申明一个二进制序列化器
BinaryFormatter formatter = new BinaryFormatter();
FileStream fs = File.Open("User.dat", FileMode.Create);

User user=new User();//创建一个用户对象
user.name="张三";
user.age=20;

formatter.Serialize(fs,user);//序列化至文件
fs.Close();//关闭

fs = File.Open("User.dat", FileMode.Open);//打开文件
User user2 = formatter.Deserialize(fs) as User;//反序列化至内存对象
Console.Write(user2);//打印反序列化的结果
Console.ReadKey();
}
    运行结果:
   Name: 张三 Age: 20

    我们可以看到,BinaryFormatter(二进制序列化器)能够将user对象序列化到文件user.dat中,然后又通过反序列化将其从user.dat读取到user2对象中,整个过程中数据没有发生丢失或者改变。

    我们知道文件在逻辑上是一个字节跟着一个字节存储的,是一个顺序的存储方式,所以这样将内存中的数据转化为一个串行的数据流的过程,我们可以称之为“序列化”;而这一过程的逆过程,就叫做反序列化了。

   除了二进制序列化器之外,系统还提供了很多其他类型的Fomatter,比如我们在项目引用之中添加了System.Runtime.Serialization.Formatters.Soap之后,还可以找到一个SoapFormatter,专门用于将对象序列化为Web Service需要的Soap格式。当然,我们也可以书写自己的Formatter,只需要将自己的格式化器类型实现IFormatter接口就可以了。 

0
相关文章