協議封裝工具 protobuf

2021-06-23 03:42:20 字數 1842 閱讀 1084

前段時間接觸了下大名鼎鼎的「protocol

buffers

1. 何為protobuf

首先,protobuf是乙個開源專案

,而且是後台很硬的開源專案。由google開發,並且在google內部久經考驗的乙個東東。由此可見,它的作者絕非一般閒雜人等可比。

簡單地說,protobuf

就是把某種資料結構的資訊,以某種格式儲存起來。主要用於資料儲存、傳輸協議格式等場合。

08年7月,google突然大發慈悲,把這個好東西貢獻給了開源社群。開源後不到一年,protobuf的人氣就已經很旺了。

2. protobuf特色

效能好/效率高

xml的效能眾所周知...

時間開銷:xml序列化的開銷倒還好;但是xml解析的開銷就不敢恭維了。在一些時間效能很敏感的場合,xml實在是心有餘力不足。

空間開銷:xml格式為了有較好的可讀性,引入了一些冗餘的文字資訊。所以空間開銷也不是太好(不過這個大多數情況不是很重要)。

google對於效能的偏執,那可是出了名的。所以,個人認為protobuf效能上不敢說是最好,但肯定不會太差。

--------------------------------

message order

--------------------------------

然後,使用protobuf內建的編譯器編譯 該proto。

序列化:

--------------------------------

// 傳送方

order order;

order.set_time(***x);

order.set_userid(123);

order.set_price(100.0f);

order.set_desc("a test order");

string sorder;

order.serailzetostring(&sorder);

// 然後呼叫某種socket的通訊庫把序列化之後的字串傳送出去

// ......

--------------------------------

// 接收方

order order;

if(order.parsefromstring(sorder))  // 解析該字串

else

--------------------------------

可以看出,使用protobuf後無需自行編寫那些協議解析的**了。

萬一將來需求發生變更,要求給訂單再增加乙個「狀態」的屬性,那只需要在order.proto檔案中增加一行**。對於傳送方(模組a),只要增加一行設定狀態的**;對於接收方(模組b)只要增加一行讀取狀態的**。

另外,如果通訊雙方使用不同的程式語言來實現,使用這種機制可以有效確保兩邊的模組對於協議的處理是一致的。

順便跑題一下。

◇支援「向後相容」和「向前相容」

部分使用者使用新版本,部分使用者使用舊版本,不同版本的協議是可以相容的.

3. protobuf的缺陷?

二進位制格式導致可讀性差

為了提高效能,protobuf採用了二進位制格式進行編碼。這直接導致了可讀性差的問題。雖然protobuf提供了textformat這個工具類,但終究無法徹底解決此問題。

缺乏自描述

一般來說,xml是自描述的,而protobuf格式則不是。給你一段二進位制格式的協議內容,如果不配合相應的proto檔案,估計過一段時間寫的人自己也看不懂。

應用不夠廣泛

伺服器端使用xml傳輸協議,移動端使用protobuf肯定是不行的...這一點是最致命的  

利用FMDB封裝工具類

class usermodel inte ce lvfmdbtool nsobject 插入模型資料 bool insertmodel usermodel model 查詢資料,如果 傳空 缺省會查詢表中所有資料 nsarray querydata nsstring querysql 刪除資料,如果...

Vue封裝工具欄

1 在頁面如html jsp重複寫著相同的 挺繁瑣,而且不便於維護,以下嘗試自己學習如何封裝工具欄,比如四個按鈕 新增刪除 修改 查詢等,後面可以自己擴充套件 2 工具欄js 公共工具欄 function config html.push html.push template html.join d...

JavaScript實踐 AJAX封裝工具

先宣告幾個變數 var ajaxutil new object 工具物件 var xmlhttprequest xmlhttprequest物件 var satechangemethod 方法變數建立xmlhttprequest物件 執行get post的請求中傳入的方法 執行get post的請求...