频道直达:新闻 - 组网 - 安全 - 服务器 - 存储 - 系统 - 应用 - 开发 - 数据库 - 前沿 - 技术人 - 培训 - 求职 - 读书 - 教程 - 专题 - 产品 - 案例 - 技术圈 - 博客 - BBS
51CTO.COM_中国领先的IT技术网站
找资料:

在.NET Compact Framework 2.0中使用序列化

作者: 黎波 出处:Csdn博客 2007-06-28 09:59    砖    好    评论   进入论坛
阅读提示:.NET Compact Framework 2.0 支持XML序列化,不支持二进制序列化和SOAP序列化。利用序列化技术,可以实现对象的备份和还原。序列化可以将内存中的对象(或对象图)序列化为数据流,并保存到磁盘上进行持久化;还可以将数据流反序列化为对象,实现对象的还原。

【引自黎波的博客】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 中的一样。

// 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() { } 
}

然后重写 Equals 方法。

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 加上 [CompactFormatter.Attributes.Serializable()] 特性,并重写了它的 Equals 方法,现在可以使用 CompactFormatter 进行序列化了。

// 二进制序列化 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)的高性能数据传输。

示例代码下载:SerializationMobile.rar

【相关文章】

【责任编辑:火凤凰 TEL:(010)68476606-8007】

专题
专题:ASP.NET 2.0基础开发指南
.NET移动与嵌入式技术专题
.NET Framework新手入门专题
VS.NET实用开发专题
ADO.NET实用技巧专题
我也说两句

匿名发表

(如果看不清请点击图片进行更换)


中 国 领 先 的 IT 技 术 网 站 ·
技 术 成 就 梦 想
·Java基础教程 (查看81024次)
·UML类图详解 (查看72498次)
·C++是垃圾语言?! (查看42631次)
·C#技术开发指南 (查看40232次)
·UML统一建模语言 (查看39205次)
·Java编程开发手册 (1198个砖)
·Java基础教程 (431个砖)
·C#技术开发指南 (311个砖)
·.NET开发手册 (254个砖)
·PB开发教程 (223个砖)
·Java编程开发手册 (658个好)
·Java基础教程 (578个好)
·.NET开发手册 (282个好)
·PB开发教程 (213个好)
·Delphi开发技术手册 (200个好)
订阅技术快讯
电子杂志下载
名称:SQL Server数据库管理精品黄皮书
简介:书中文章经过精挑细选,便于用户能根据自己的实际工作和学习,快速在本书寻找到相关资料。内容涵盖了SQL Server的安装与升级、语句查询、数据备份和恢复、自动化任务、数据同步、数据字典、安全和预防、性能和优化、集群等各方面应用信息,以及DBA管理人员在数据库管理工作中
名称:2007路由技术大全
简介:《2007路由技术大全》由51CTO.com网站特别策划制作,该书包括路由器技术、路由器产品、路由器配置、安全设置、路由器故障处理、路由器密码恢复,以及广大网友在实践使用中的心得经验和技巧文章,内容注重实用性,适用于初学者入门,也适合多年从业者提高,是一本实践和理论完
名称:网络安全精品应用黄皮书
简介:《2007精品网络安全黄皮书》包括了9个大类24个小类, 800余篇文章,内容包含了熊猫烧香病毒、DDOS攻击、ARP病等热点问题的介绍及解决方案。从病毒查杀、防范、系统、数据等各方面的安全设置到黑客技术的了解、防范,涉及到了安全应用的全部领域, 由浅至深内容全面。