在WIN CE 6.0平台上进行序列化与反序列化

一、为什么要序列化和反序列化
      现在的高级语言绝大部分都是面向对象语言,而如何在不同的应用程序之间共享对象和传递对象就成为热点。要让不同应用之间都能识别和共享对象,这就需要双方都要协商共享对象存储的格式。所以在这里可以看到序列化的就是一个过程,一个什么样的过程呢?加上一些定语:将对象状态保持和保存为可通信、传输的格式的过程。与之相对应的反序列化,反序列化就是将流解释为对象的过程,可以理解成逆操作。一般这两个过程都是以整体的形式出现的,结合序列化和反序列化可以很容易的存储和转存对象数据。
注意的是在.NET Framework中有两种序列化方式:
  • 二进制序列化是类型高保真的,在不同的应用程序调用时保持了对象的状态,很精确。
  • XML序列化仅序列化公有的属性和字段,不具有二进制序列化的特点。它不限制使用数据的应用程序,因为它以XML作为存储格式。你需要了解XML的强大。XML是开放的web文本标准,在互联网的数据交换中作为标准而使用。所以在internet上共享数据,选择XML序列化是一个很好的选择。另外XML序列化还有一个优点是可配置,你只要有个notepad就可以手动添加对象,前提是考虑到应用程序在反序列化是的异常捕获。
FCL具体的实现方式请参考MSDN。本文着重介绍WIN CE平台上的序列化和反序列化。
二、如何在WIN CE 上序列化和反序列化
      WIN CE是微软嵌入式操作系统目前的使用版本是6.x,笔者在测试时使用的6.0 version。受到硬件等的影响,WIN CE不可能像pc机那样拥有超强的计算能力。.NET是个跨平台的架构,如何在WIN CE上使用呢?在WIN CE平台上仅仅支持compact framework。也就是说绝大部分的方法和类都不支持,需要手动设计或者进行P/INVOKE平台调用引用非托管的组件或者借助第三方提供。
      无论如何在WIN CE 上使用.NET CF开发还是很方便的如果不考虑性能及效率外。
      .NET CF不支持二进制序列化和反序列化,有第三方的组件CompactFormatter.dll。
      .NET CF支持XML序列化和反序列化。      
当然使用CF进行XML序列化和反序列化与在pc平台上时一样的。下面的例子是序列化一个Person对象数组,Person是基类,派生两个子类:Student,Doctor。另外这两个类实现IDo接口。UML类图如下:
       
图 2.1 Person类图
我们的任务就是如何将一个Person对象数组序列化成XML文件保存下来。请看下面的代码示例:


 1        
 2         public const string fileName = "b.xml";//转存的文件名
 3         private Person[] p;//待序列化的对象数组。
 4 
 5 
 6         /// <summary>
 7         ///  序列化反序列化person数组对象
 8         ///  将对象保存在xml文件中
 9         /// </summary>
10         private void InitData() {
11             //序列化           
12             System.IO.StreamWriter sw = new System.IO.StreamWriter(fileName, false);
13             if (System.IO.File.Exists(fileName)) {
14                 p = new Person[5]{
15                       new Student("egan",22),  //Student对象
16                       new Student ("emily",25),
17                       new Student("kirk",22),
18                       new Doctor("mike",33),   //Doctor对象
19                       new Doctor ("selina",26)
20                 };//initialize data
21                 System.Xml.Serialization.XmlSerializer ser = new System.Xml.Serialization.XmlSerializer(typeof
(Person));
22                 ser.Serialize(sw, p); //序列化p到文件流并且保存
23             }
24             else {
25                 //反序列化
26                 System.IO.Stream s = new System.IO.FileStream(fileName, System.IO.FileMode.OpenOrCreate, System.IO.FileAccess.Read);
27                 System.Xml.Serialization.XmlSerializer ser = new System.Xml.Serialization.XmlSerializer(typeof
(Person));
28                 p = ser.Deserialize(s) as Person[];//反序列化为对象数组
29             }
30 
      通过上述代码的分析,我们看出CF下的序列化与FCL中的序列化大同小异,但是请注意尽量优化,毕竟是嵌入式平台无法和pc机比较,当时代发展到平常的移动设备能和pc机相抗衡了,可能就没有嵌入式了。
      谢谢各位斧正!
posted @ 2009-08-26 14:28  F.Wang  阅读(911)  评论(2)    收藏  举报