前段時間接觸了下大名鼎鼎的「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的請求...