在.NET Compact Framework 2.0中使用序列化
2009-01-09 12:08
971 查看
1.序列化概述
序列化(Serialization)是.NET平台最酷的特性之一。利用序列化技术,可以实现对象的备份和还原。序列化可以将内存中的对象(或对象图)序列化为数据流,并保存到磁盘上进行持久化;还可以将数据流反序列化为对象,实现对象的还原。序列化技术在分布式系统的数据传输中得到充分的利用,如:XML Web Service 利用XML序列化实现跨平台,.NET Remoting 则用到了二进制序列化和SOAP序列化。
.NET Compact Framework 2.0 支持XML序列化,不支持二进制序列化和SOAP序列化。而 .NET Compact Framework 1.0 连XML序列化都不支持。不过 OpenNETCF 1.x 为 .NET CF 1.0 实现了一个XML序列化的类,这个类在 OpenNETCF.Xml.dll 程序集中可以找到。
2.XML 序列化
在 .NET CF 2.0 中使用XML序列化很简单,跟 .NET Framework 中的一样。
以上示例将对象序列化后,写入内存流中。你可以换成文件流(FileStream),这样就可以实现对象的持久化。
3.二进制序列化
从理论上说,二进制序列化无论是性能还是序列化后的数据流大小都比XML序列化更具优势,这个我曾经在《实战 Web Service 压缩传输》的PPT和Demo 中深入分析过。.NET CF 2.0 并没有提供二进制序列化的类,如果你想在 .NET CF 2.0 中进行二进制序列化,可以通过第三方的开源组件 CompactFormatter 来实现。由于CompactFormatter 同时支持 .NET CF 和 .NET Framework,我们可以将 CompactFormatter 序列化后的数据流可以转换为 byte[],并传输到服务器后进行反序列化。
今天我简单介绍一下 CompactFormatter 的使用,用来跟上面的XML序列化进行比较。
为了让一个实体类能够被 CompactFormatter 序列化,首先需要将这个实体类加上[CompactFormatter.Attributes.Serializable()] 特性。
然后重写 Equals 方法。
就如上面的代码中,我将实体类 Customer 加上 [CompactFormatter.Attributes.Serializable()] 特性,并重写了它的 Equals 方法,现在可以使用 CompactFormatter 进行序列化了。
4.序列化示例
为了比较 .NET CF 2.0 下的XML序列化和 CompactFormatter 的二进制序列化,我做了一个示例,可以用它来测试两种序列化的性能。我会用两种序列化方法对一个包含1000个 Customer 对象的数组进行序列化和反序列化,并记录两种方法各自耗费的时间和序列化后数据流的字节大小。
具体操作是在 Visual Studio 2005 中采用调试模式将示例程序部署到 Pocket PC 2003 仿真器(最新的V2版本)中并运行。先执行XML序列化,接着执行XML反序列化,然后退出程序。在调试模式下重新启动示例程序,先后执行二进制序列化和二进制反序列化。测试结果如下
:
XML序列化
字节数:207870
耗时:6秒
XML反序列化
耗时:4秒
二进制序列化
字节数:200867
耗时:3秒
二进制反序列化
耗时:2秒
从测试结果看,CompactFormatter 的二进制序列化速度比XML序列化要快1倍,反序列化也是快1倍。但是序列化后的数据流大小却相差不多,这点我有点失望。
5.总结
在现实应用中,CompactFormatter 可以搭配 SharpZipLib 和 WS-Attachment 使用,从而实现低速网络下(GPRS/CDMA)的高性能数据传输。
源码下载:http://www.cnblogs.com/files/upto/serializationmobile.rar
序列化(Serialization)是.NET平台最酷的特性之一。利用序列化技术,可以实现对象的备份和还原。序列化可以将内存中的对象(或对象图)序列化为数据流,并保存到磁盘上进行持久化;还可以将数据流反序列化为对象,实现对象的还原。序列化技术在分布式系统的数据传输中得到充分的利用,如:XML Web Service 利用XML序列化实现跨平台,.NET Remoting 则用到了二进制序列化和SOAP序列化。
.NET Compact Framework 2.0 支持XML序列化,不支持二进制序列化和SOAP序列化。而 .NET Compact Framework 1.0 连XML序列化都不支持。不过 OpenNETCF 1.x 为 .NET CF 1.0 实现了一个XML序列化的类,这个类在 OpenNETCF.Xml.dll 程序集中可以找到。
2.XML 序列化
在 .NET CF 2.0 中使用XML序列化很简单,跟 .NET Framework 中的一样。
// XML序列化 Customer 数组 using (System.IO.MemoryStream ms = new System.IO.MemoryStream()) { Customer[] customers = GetCustomers(); //从数据库或远程服务器获取客户 System.Xml.Serialization.XmlSerializer ser = new System.Xml.Serialization.XmlSerializer(typeof(Customer)); ser.Serialize(ms, customers); byte[] buffer = ms.ToArray(); // 获取XML文档的内容 string xml = System.Text.Encoding.ASCII.GetString (buffer , 0, buffer .Length); } // XML反序列化 Customer 数组 using (System.IO.MemoryStream ms = new System.IO.MemoryStream(buffer)) { System.Xml.Serialization.XmlSerializer ser = new System.Xml.Serialization.XmlSerializer(typeof(Customer)); Customer[] customers = ser.Deserialize(ms) as Customer[]; }
以上示例将对象序列化后,写入内存流中。你可以换成文件流(FileStream),这样就可以实现对象的持久化。
3.二进制序列化
从理论上说,二进制序列化无论是性能还是序列化后的数据流大小都比XML序列化更具优势,这个我曾经在《实战 Web Service 压缩传输》的PPT和Demo 中深入分析过。.NET CF 2.0 并没有提供二进制序列化的类,如果你想在 .NET CF 2.0 中进行二进制序列化,可以通过第三方的开源组件 CompactFormatter 来实现。由于CompactFormatter 同时支持 .NET CF 和 .NET Framework,我们可以将 CompactFormatter 序列化后的数据流可以转换为 byte[],并传输到服务器后进行反序列化。
今天我简单介绍一下 CompactFormatter 的使用,用来跟上面的XML序列化进行比较。
为了让一个实体类能够被 CompactFormatter 序列化,首先需要将这个实体类加上[CompactFormatter.Attributes.Serializable()] 特性。
[CompactFormatter.Attributes.Serializable()] public class Customer { public Customer() { } } |
public override bool Equals(object obj) { if (!obj.GetType().Equals(typeof(Customer))) { return false; } else { Customer answer = (Customer)obj; return (answer.ID == ID && answer.Name == Name); } } |
// 二进制序列化 Customer 数组 using (System.IO.MemoryStream ms = new System.IO.MemoryStream()) { CompactFormatter.CompactFormatter ser = new CompactFormatter.CompactFormatter(); ser.Serialize(ms, customers); byte[] buffer = ms.ToArray(); } // 二进制反序列化 Customer 数组 using (System.IO.MemoryStream ms = new System.IO.MemoryStream(buffer)) { CompactFormatter.CompactFormatter ser = new CompactFormatter.CompactFormatter(); customers = ser.Deserialize(ms) as Customer[]; }
4.序列化示例
为了比较 .NET CF 2.0 下的XML序列化和 CompactFormatter 的二进制序列化,我做了一个示例,可以用它来测试两种序列化的性能。我会用两种序列化方法对一个包含1000个 Customer 对象的数组进行序列化和反序列化,并记录两种方法各自耗费的时间和序列化后数据流的字节大小。
具体操作是在 Visual Studio 2005 中采用调试模式将示例程序部署到 Pocket PC 2003 仿真器(最新的V2版本)中并运行。先执行XML序列化,接着执行XML反序列化,然后退出程序。在调试模式下重新启动示例程序,先后执行二进制序列化和二进制反序列化。测试结果如下
:
XML序列化
字节数:207870
耗时:6秒
XML反序列化
耗时:4秒
二进制序列化
字节数:200867
耗时:3秒
二进制反序列化
耗时:2秒
从测试结果看,CompactFormatter 的二进制序列化速度比XML序列化要快1倍,反序列化也是快1倍。但是序列化后的数据流大小却相差不多,这点我有点失望。
5.总结
在现实应用中,CompactFormatter 可以搭配 SharpZipLib 和 WS-Attachment 使用,从而实现低速网络下(GPRS/CDMA)的高性能数据传输。
源码下载:http://www.cnblogs.com/files/upto/serializationmobile.rar
相关文章推荐
- 在 .NET Compact Framework 2.0 中使用序列化
- 在 .NET Compact Framework 2.0 中使用序列化
- 在 .NET Compact Framework 2.0 中使用序列化
- 在 .NET Compact Framework 2.0 中使用序列化
- 在 .NET Compact Framework 2.0 中使用序列化
- 使用 .NET Compact Framework 2.0 生成 Wi-Fi 发现应用程序
- 使用 .NET Compact Framework 2.0 生成 Wi-Fi 发现应用程序
- 使用 .NET Compact Framework 2.0 生成 Wi-Fi 发现应用程序 (转MSDN)
- log4net 在.net CompactFramework 2.0中的使用
- 使用 .NET Compact Framework 2.0 生成 Wi-Fi 发现应用程序
- 使用 .NET Compact Framework 2.0 生成 Wi-Fi 发现应用程序
- 使用托管类库加速.Net Compact Framework开发
- 如何:在 .NET Compact Framework 中使用 DateTimePicker 类
- Windows Moible, Wince 使用.NET Compact Framework的进行蓝牙(Bluetooth)开发 之 蓝牙虚拟串口 (Bluetooth Virtual Serial Port)
- .Net Framework 2.0 使用WCF
- 使用.NET Compact Framework开发Windows Mobile程序,不能触发OnKeyPress/OnKeyDown的原因及解决办法
- .NET Compact Framework 2.0的增强
- 使用.net framework 2.0用c#编写ActiveX控件(编写,部署,升级更新)
- 在Enterprise Library for .NET Framework 2.0中使用外部的配置元数据的文件(my.config)
- .NET Compact Framework使用P/Invoke服务