自行開發高效精簡的二進位制序列化庫(支援精簡框架集)

2021-08-24 19:59:10 字數 3169 閱讀 8495

在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等 的分析一直上工具類的排行榜,受到了非常多地關注。我們的工作主要是想通過靜態分析...