黎波

Windows Mobile for Line of Business

用户操作
[即时聊天] [发私信] [加为好友]
黎波ID:upto
168874次访问,排名449好友0人,关注者60
upto的文章
原创 96 篇
翻译 0 篇
转载 1 篇
评论 273 篇
黎波的公告

Windows Mobile MVP
October 2007

[邮箱]
china.libo AT gmail.com
最近评论
deng:ffxi gil
Maple Story Mesos
World of Warcraft is a fascinating game that it deserved this year for best large-scale online games, and even perhaps the best online games ever. Get A Ton of C……
wowgolds987:World of Warcraft is a fascinating game that it deserved this year for best large-scale online games, and even perhaps the best online games ever. Get A Ton of C……
大卫哥:你说是都是存储过程,如果是access不支持存储过程,你的分页存储过程就没有用了啊.
ciahi:你好,请问怎么在Mobile 中使用gdi+?
Native API
我装了Moible的6.0 SDK,在它的include下面根本找不到gdiplus.h,在lib下面也找不到相应的库

应该如何解决???

3Q!
文章分类
收藏
    相册
    RapidTier
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 在 .NET Compact Framework 2.0 中使用序列化收藏

    新一篇: 我经常关注的博客 | 旧一篇: 在 Windows Mobile 使用 WS-Attachment 传输二进制数据

    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日

    本文属于作者原创,转载请注明作者和出处,谢谢合作!

     

    发表于 @ 2007年06月25日 22:52:00|评论(loading...)|编辑

    新一篇: 我经常关注的博客 | 旧一篇: 在 Windows Mobile 使用 WS-Attachment 传输二进制数据

    评论

    #PrideRock 发表于2007-06-27 13:33:17  IP: 210.77.134.*
    不错u
    #wangshangy 发表于2007-09-29 20:21:42  IP: 222.66.175.*
    您好,我使用了CompactFormatter 进行二进制序列户化,保存的本地的时候,出来的结果中,包含了很多的空格,是不是Unicode的问题?比如 “區 "C u s t o m e r 1 2 3 6 3 5 0 2 9" ,我想,这里的空格是不是占用了很多的空间,怎么处理呢?我一直没能解决,希望您能帮忙
    发表评论  


    登录
    Csdn Blog version 3.1a
    Copyright © 黎波