在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
test1 t=new test1();
t.o=t; //
為自身
如果對t
序列化,則.net compact framework xml
和compactformatterplus
都會出現異常,此外對compactformatterplus
,如果enum
型別的基礎型別不是預設的int
型,也會丟擲異常,如下面的列舉:
enum test
:byte ;
主要測試**如下:
二進位制 二進位制起源
現代通訊技術的基礎是二進位制編碼。早在1865年麥克斯韋總結出麥克斯韋方程組之前,美國人摩斯 morse 於1837年發明了摩斯電碼和有線電報。有線電報的出現,具有劃時代的意義 它讓人類獲得了一種全新的資訊傳遞方式,這種方式 看不見 摸不著 聽不到 完全不同於以往的信件 旗語 號角 烽火,這也是二進...
序列 2018 10 27 二進位制優化
我們可以發現,aor ba or b aorb 一定不會比a aa或者b bb要小,所以直接輸出最大的o n o n o n 內的最大或值。對於a an dba and b aand b是會越來越小的,所以長度為k kk的區間一定是有最優解,此題的關鍵就在於處理這個o 30 m o 30m o 30...
二進位制檔案檢視工具 開發二進位制檔案靜態快速分析工具
眾人拾柴火焰高。工具一直都受到讀者的喜愛,只要有工具二字,文章的閱讀量都會多一些。所以,近來介紹推薦的工具類文章非常多。其實開發這個工具,是受到上篇文章的啟發,萌生了念頭。對二進位制檔案 exe dll bin sys等 的分析一直上工具類的排行榜,受到了非常多地關注。我們的工作主要是想通過靜態分析...