在WIN CE 6.0平台上进行序列化与反序列化
一、为什么要序列化和反序列化


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
现在的高级语言绝大部分都是面向对象语言,而如何在不同的应用程序之间共享对象和传递对象就成为热点。要让不同应用之间都能识别和共享对象,这就需要双方都要协商共享对象存储的格式。所以在这里可以看到序列化的就是一个过程,一个什么样的过程呢?加上一些定语:将对象状态保持和保存为可通信、传输的格式的过程。与之相对应的反序列化,反序列化就是将流解释为对象的过程,可以理解成逆操作。一般这两个过程都是以整体的形式出现的,结合序列化和反序列化可以很容易的存储和转存对象数据。
注意的是在.NET Framework中有两种序列化方式:
- 二进制序列化是类型高保真的,在不同的应用程序调用时保持了对象的状态,很精确。
- XML序列化仅序列化公有的属性和字段,不具有二进制序列化的特点。它不限制使用数据的应用程序,因为它以XML作为存储格式。你需要了解XML的强大。XML是开放的web文本标准,在互联网的数据交换中作为标准而使用。所以在internet上共享数据,选择XML序列化是一个很好的选择。另外XML序列化还有一个优点是可配置,你只要有个notepad就可以手动添加对象,前提是考虑到应用程序在反序列化是的异常捕获。
二、如何在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
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
28 p = ser.Deserialize(s) as Person[];//反序列化为对象数组
29 }
30
通过上述代码的分析,我们看出CF下的序列化与FCL中的序列化大同小异,但是请注意尽量优化,毕竟是嵌入式平台无法和pc机比较,当时代发展到平常的移动设备能和pc机相抗衡了,可能就没有嵌入式了。
谢谢各位斧正!

浙公网安备 33010602011771号