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

转载 2013年12月04日 15:11:14

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 来实现。我在去年5月份就介绍过 CompactFormatter,详细请看 让 .NET Compact Framework 支持 Binnary Serialization。由于 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)的高性能数据传输。关于 WS-Attachment 的使用可以参考我之前写的文章 在 Windows Mobile 使用 WS-Attachment 传输二进制数据。我接下来会对 Windows Mobile 下的压缩组件进行评测,感兴趣的朋友请关注我的博客。

示例代码下载:SerializationMobile.rar

作者:黎波
博客:http://upto.cnblogs.com/
日期:2007年4月20日

.NET 2.0 使用最新版的JSON.net 进行反序列化

大家知道 JSON.net 最新版是基于.net 3.5 框架的,要如何使其工作在 .NET 2.0框架下呢,当然是GOOGLE + baidu 啦,幸不辱命,终于在一篇英文的博客中找到了解决方法,地...
  • lvjin110
  • lvjin110
  • 2013年12月09日 19:35
  • 3155

.Net Standard扩展支持实例分享

上篇(.Net基础体系和跨框架开发普及)介绍了.Net当前生态下的大概情况,也分享了简单实现的过程,这篇文章就是讲解我的OSS.Common项目扩展.Net Standard 支持的过程,主要集中在:...
  • swywkc2i
  • swywkc2i
  • 2017年02月15日 21:19
  • 1334

C# FrameWork版本兼容 App.config配置列表

添加或查找 .NET Framework 项目的配置文件。 应用程序的配置文件与该应用程序位于相同的目录中,并且具有相同的名称,只不过它具有扩展名 .config。 例如,对于名为 MyExecuta...
  • QDseashore
  • QDseashore
  • 2016年08月26日 01:12
  • 1516

.NET 2.0 使用最新版的JSON.net 进行反序列化

大家知道 JSON.net 最新版是基于.net 3.5 框架的,要如何使其工作在 .NET 2.0框架下呢,当然是GOOGLE + baidu 啦,幸不辱命,终于在一篇英文的博客中找到了解决方法,地...
  • lvjin110
  • lvjin110
  • 2013年12月09日 19:35
  • 3155

在Windows Mobile和Wince(Windows Embedded CE)下使用.NET Compact Framework进行GPS NMEA data数据分析的开发

转:http://www.cnblogs.com/procoder/archive/2009/05/05/1450219.html   提供GPS功能的Wince和Windows Mobile都需...
  • sx811125
  • sx811125
  • 2012年02月10日 11:26
  • 505

DBFrm(使用.net的反射机制,实体对象的映射 序列化备份还原数据)

  • 2009年09月17日 17:01
  • 679KB
  • 下载

.NET Compact Framework下使用NUintLite进行单元测试(在WinCE上)

这里有一个关键就是.NET Compact Framework的版本一定要和NUintLite的版本一致,否则将无法进行测试。 在WinCE的“Program.cs”中添加如下代码:       ...
  • esunshine1985
  • esunshine1985
  • 2013年06月09日 16:57
  • 619

.NET Compact Framework使用P/Invoke服务 (一)

.NET Compact Framework使用P/Invoke服务 (一)
  • cpcpc
  • cpcpc
  • 2011年01月11日 17:03
  • 485

Windows Mobile使用.NET Compact Framework开发Winform时如何Dispose资源

背景在开发3G应用的时候,程序退出了,需要自动关闭已经打开的链接。这样需要在Winform退出的时候把其分配的资源都dispose掉。本文讲述Winform Dispose资源的几种方法。方案方案一使...
  • xiaolei05
  • xiaolei05
  • 2011年05月01日 12:07
  • 1781

Windows Moible, Wince 使用.NET Compact Framework的进行蓝牙(Bluetooth)开发 之 Windows Embedded Source Tools for Bluetooth

本文讲述了Windows Moible, Wince 使用.NET Compact Framework的进行蓝牙(Bluetooth)开发 之 Windows Embedded Source Tool...
  • Program_MyLife
  • Program_MyLife
  • 2011年03月26日 20:41
  • 389
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:在 .NET Compact Framework 2.0 中使用序列化
举报原因:
原因补充:

(最多只允许输入30个字)