【IT168技术文档】
为说明持久化一个JamesBondCar的实例到一个物理文件中是多么简单,我们使用BinaryFormatter二进制类型。再次注意BinaryFormatter类型的两个关键方法:Serialize()和Deserialize()。
l Serialize():将一个对象图按字节的顺序持久化到一个指定的流。
l Deserialize():将一个持久化的字节顺序转化为一个对象图。
假设已经建立了JamesBondCar的一个实例,修改了一些状态数据,并想将间谍汽车[6]持久化到一个*.dat文件中。第一个任务是建立*.dat文件本身。这可以通过建立一个System.IO.FileStream类型的实例来完成(见第16章)。此刻,仅仅建立一个BinaryFormatter的实例并传进FileStream和对象图进行持久化:
可见,BinaryFormatter.Serialize()方法是一个负责生成对象图并将字节顺序移动到流的派生类型的成员。在这个例子中,流碰巧是一个物理文件。然而,也可以序列化对象类型为任意流的派生类型,例如放置到内存中,前提是MemoryStream是流类型的派生类。using System.Runtime.Serialization.Formatters.Binary; using System.IO; ... static void Main(string[] args) { Console.WriteLine("***** Fun with Object Serialization *****\n"); // 建立一个JamesBondCar并设定状态。 JamesBondCar jbc = new JamesBondCar(); jbc.canFly = true; jbc.canSubmerge = false; jbc.theRadio.stationPresets = new double[]{89.3, 105.1, 97.1}; jbc.theRadio.hasTweeters = true; // 将对象以二进制保存到一个名为CarData.dat的文件。 BinaryFormatter binFormat = new BinaryFormatter(); Stream fStream = new FileStream("CarData.dat", FileMode.Create, FileAccess.Write, FileShare.None); binFormat.Serialize(fStream, jbc); fStream.Close(); Console.ReadLine(); }
使用BinaryFormatter反序列化对象
现在假定你在考虑从二进制文件中读取被持久化的JamesBondCar并将其恢复到一个对象变量中。一旦以编程方式打开CarData.dat(通过File.OpenRead()方法)文件,只需要调用BinaryFormatter的Deserialize()反序列化方法。要知道Deserialize()返回一个基本的System.Object类型,所以需要强制施加外部转换,如下面显示的:
static void Main(string[] args) { ... // 从二进制文件中把JamesBondCar对象读取到流中。 fStream = File.OpenRead("CarData.dat"); JamesBondCar carFromDisk = (JamesBondCar)binFormat.Deserialize(fStream); Console.WriteLine("Can this car fly? : {0}", carFromDisk.canFly); fStream.Close(); Console.ReadLine(); }