第24章运行时序列化
序列化(serialization)是将一个对象或者对象图转换成一个字节流的过程。反序列化(deserialization)是将一个字节流转换回对象图的过程。
应用程序的状态(对象图)可轻松保存到一个磁盘文件或数据库中,并在应用程序的下次运行时恢复。ASP.NET就是利用序列化和反序列化来保存和恢复会话状态的。
一组对象可轻松通过网络发送给另一台机器上运行的过程。Microsoft .Net Framework的Remoting(远程处理)架构会对按值封送(marshaled by value)的对象进行序列化和反序列化。这个技术还可用于跨越AppDomain边界发送对象。
24.1 序列化/反序列化快速入门
using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
class Program
{
static void Main()
{
List<int> array = new List<int>() { 123, 123, 534, 5, 7567, 234 };
//序列化
MemoryStream ms = new MemoryStream();
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(ms, array);
//重置流的位置
ms.Position = 0;
//读取流的内容
//StringBuilder sb = new StringBuilder();
//for (int i = 0; i < ms.Length; i++)
//{
// int by = ms.ReadByte();
// sb.Append(((char)by).ToString());
//}
//Console.Write(sb.ToString());
//反序列化
array = (List<int>)bf.Deserialize(ms);
foreach (int i in array)
Console.WriteLine(i);
Console.ReadKey();
}
}
FCL提供了两个格式化器:BinaryFormatter和SoapFormatter,从.Net 3.5起,SoapFormatter类已被废弃。
要序列化一个对象图,只需要调用格式化器的Serialize方法,并向它传递两样东西:对一个流对象的引用,以及对想要序列化的对象图的一个引用。
格式化器的Deserialize方法会检查流的内容,构造流中的所有对象的实例,并初始化所有这些对象的字段,使它们具有与当初序列化时相同的值。通常将Deserialize方法返回的对象引用转型为应用程序期待的类型。
注意点:
保证代码为序列化和反序列化使用相同的格式化器。
可将多个对象图序列化到一个流中。
24.2 使类型可序列化
为需要序列化的类型应用一个名为System.SerializableAttribute的定制attribute。
SerializableAttribute这个定制Attribute只能应用于引用类型(class),值类型(struct),枚举类型和委托类型。枚举和委托类型总是可序列化的,所以不必显式应用SerializableAttribute attribute。
SerializableAttribute attribute不会被派生类继承。
[Serializable]
class MyClass { }
[Serializable]
struct MyStruct { }