在06年开发基于Window CE的嵌入式组态软件时就曾遇到序列化问题,由于程序运行在Window CE平台,其上的.Net Compact Framework仅支持XML序列化,而XML序列化不仅序列化后的体积较大,而且执行时间较长(参见我以前写的文章:嵌入式组态环境升级及XML反序列化慢的困惑、如何加速XML反序列化(精简框架集2.0SP1,WinCE4.2))。
而当时支持.Net Compact Framework的二进制序列化就是CompactFormatter(参见黎波的文章: 在.NET Compact Framework 2.0 中使用序列化)了,由于是第三方所开发,功能上尚不完善,故没有选用。
前段时间看MSN Direct代码,发现使用.Net Micro Framework二进制序列化后的广播数据比较小,并且速度快。所以想办法把相关代码做了平台移植,可没有想到的是在.net micro Framework和.Net Framework中都可以正常运行的代码,在.NET Compact Framework中竟然不能运行(主要是对Assembly操作的相关函数支持不够)。
由于目前在.Net Compact Framework开发的应用逐渐增多,并且最近也打算升级原先开发的嵌入式组态软件,经过再三考虑决定自行开发支持精简框架集的二进制序列化(说明:.Net Micro Framework平台上的二进制序列化,由于运行在ARM系列的CPU上,会考虑一些大小端的问题,所以多于一个byte的值变量都要进行特殊处理,速度相对较慢,不过.Net Micro Framework二进制序列化的优点是,支持bit序列化(bool变量按位存取,也可以为其它变量指定位数),所以它的序列化结果是最精简的)。
有.Net Micro Framework二进制序列化代码做参考,所以自行开发一个支持精简框架集二进制序列化库,并不是一件特别繁杂和痛苦的事:-)
在开发二进制序列化之前,对要完成的二进制序列化库,有以下几方面的考虑:
一、速度要快;
二、体积要小;
三、要支持自定义序列化;
针对第一点,故舍弃了.Net Micro Framework二进制序列化的bit序列化支持,并且精简了一些功能,比如仅支持原生数据类型的一维数组序列化,仅支持ArrayList,不支持泛型,此外不自行反射Assembly中的Type,和.Net Compact Framework 的XML序列化一样,需要开发者从外部传入Type列表;
针对第二点采用了很多.Net Micro Framework的二进制序列化思想,如序列化后的数据中不保存Type 的完整的名字,仅保存该名字的4个字节的哈希值,字符串的长度和数组长度用变长的1~4个字节的空间来保存,多个对象引用相同,仅保存首个对象等等;
而第三点主要和我开发的嵌入式组态功能相关,大量的图元派生于基类图元,而基类中的大量属性,在不同的图元中用到的都不同,如果一概而论全部序列化,则结果会比较大,而采用自定义序列化就能很好地解决这个问题。此外值得一提的是.Net Micro Framework二进制序列化和.Net Compact Framework XML序列化都不支持该功能。
用了我大约4天的时间,终于完成了.Net Compact Framework 二进制序列化的第一版V0.1,目前测试的结果还是令人满意的(以下结果是在windows平台下测试的,循环执行100次)。
1、.Net Micro Framework binary serialize
Data Length : 103 byte
Serialize Time : 46 ms
Deserialize Time : 46 ms
2、.Net Compact Framework xml serialize
Data Length : 998 byte
Serialize Time : 31545 ms
Deserialize Time : 34092 ms
3、CompactFormatterPlus binary serialize
Data Length : 1598 byte
Serialize Time : 103 ms
Deserialize Time : 132 ms
4、.Net Framework binary serialize
Data Length : 828 byte
Serialize Time : 18 ms
Deserialize Time : 17 ms
5、Yefan binary serialize
Data Length : 113 byte
Serialize Time : 8 ms
Deserialize Time : 8 ms
由以上可以看出,除了在体积上稍稍大于.Net Micro Framework的二进制序列化外,和其它序列化后的结果相比,几乎相差一个数量级,此外执行时间是最小的,并且其它相比,是几个数量级的差别。
在开发二进制序列化过程中发现,.Net Compact Framework xml和CompactFormatterPlus都不支持循环引用,如下面的类:
Class Test1
{
Public int v1=0;
Public Object o=null;
}
Test1 t=new Test1();
t.o=t; //为自身
如果对t序列化,则.Net Compact Framework xml和CompactFormatterPlus都会出现异常,此外对CompactFormatterPlus,如果enum类型的基础类型不是默认的int型,也会抛出异常,如下面的枚举:
Enum Test:byte {one ,two};
主要测试代码如下:
下载地址:http://www.sky-walker.com.cn/yefan/YFSerializeTest.rar
分享到:
相关推荐
Delphi进制转换,十进制,二进制,十六进制,字符串--超短精简
图片上传后自动转化为二进制流,最精简演示图片转化过程。
专为程序员打造的计算器,二进制运算强大,支持64位。 采用表达式驱动,输入表达式便即时显示结果,抛弃传统计算器繁琐的按钮,表达式可粘贴或回调重复使用。 支持二进制串直接运算,如0b1101 & 0b0011= 0b0001。 ...
下载后直接编译就行 有代码的注释 相当精简
保留了vc工程编辑所需要的dll及配置文件,除了不能编译和调试,其它的功能基本都保留了.
LightBDD:Java中的二进制决策图LightBDD是用于构建和组合精简二进制决策图的准系统库,精简二进制决策图是用于存储大型布尔函数的真值表的内存有效数据结构。 看看看看它是如何工作的。BDD BDD广泛用于逻辑电路设计...
进制转换工具绝对精简使用方便文件超小进制转换工具绝对精简使用方便文件超小
进制转换1.2是进制转换1.1的升级版本,可在二进制、十进制、十六进制之间互转。 1.2版相对于1.1版更新 1、优化二进制格式化显示。 2、增加十六进制格式化显示。 3、去掉多余的无用功能,精简优化代码,使编译后的...
当.NET精简框架刚诞生的时候,二位专家又经过多年潜心跟踪与研究,并与.NET精简框架开发团队紧密合作,推出了《.NET精简框架程序设计——C#版》,带领广大Windows程序员从成熟的桌面开发转入潜力无限的移动及嵌入式...
extract_thin.sh-从解密过的app.ipa文件中提取精简二进制文件(如果需要,对于所有框架二进制文件也是如此)。 replace_bin.sh-将所有二进制文件打包到app.ipa中,如果frameworks工作目录是由extract_thin.sh创建的...
VBSP6精简版_插件运行库齐全_兼容XP WIN7 WIN8 WIN10,个人制作已用10年,绝对好用.
十六进制转换器--精简小工具,对编程有一些帮助,需要的人可以下在,给点评价,呵呵!
电子科技大学CPU设计:精简指令集(RISC)32位单周期cpu设计.pdf电子科技大学CPU设计:精简指令集(RISC)32位单周期cpu设计.pdf电子科技大学CPU设计:精简指令集(RISC)32位单周期cpu设计.pdf电子科技大学CPU设计:精简...
精简与复杂指令集CPU的比较,对使用精简指令集开发还是复杂指令集开发软件做了较全面的分析。
基于Springboot开发的精简博客系统的设计与实现论文-基于Springboot开发的精简博客系统的设计与实现-文档 论文: !!!本文档只是论文参考文档! 需要项目源码、数据库sql、开发文档、毕设咨询等,请私信联系~ ① ...
旨在为用户提供一个功能强大、高效可靠、简单易用、可轻松做出炫酷效果的 GUI 引擎,并支持跨平台同步开发,一次编程,终生使用。 最终目标: 支持开发嵌入式软件。 支持开发Linux应用程序。 支持开发...
在我们用到SSH框架的时候,导入jar包,或多或少遇到jar的包问题,让人头疼,本人花了一段时间精简了SSH框架jar包,希望对大家有用.....
为了降低频繁项集数量,使其更加利于应用,提出了一种基于格结构的频繁项集精简模型,并证明了该方法产生支持度误差的范围;此外,在模型的基础上提出了一种模糊等价类精简表示算法FEC。实验结果表明,该方法能够...
②手动精简Win 7的驱动; ③Win SXS的再精简批处理。 使用方法: ①首先使用Rt7 Lite加载配置文件对提取出来的ISO文件进行精简; ②加载install.wim文件到本地的一个空文件夹,对相关文件夹进行取得管理员权限操作...
开源的十六进制转十进制工具,希望对大家有用