ProtoBuf.js – Protocol Buffers的Javascript實現(轉)


原文鏈接:ProtoBuf.js – Protocol Buffers的Javascript實現

推薦前端網址:http://keenwon.com/

在Javascript里比較常見的數據格式就是json,xml,但是這兩種格式在數據傳輸方面有明顯不足。而Protocol Buffers可以很好的解決這個問題,下面引用百科的對Protocol Buffers的定義:

 

Protocol Buffers是Google公司開發的一種數據描述語言,類似於XML能夠將結構化數據序列化,可用於數據存儲、通信協議等方面。它不依賴於語言和平台並且可擴展性極強。現階段官方支持C++、JAVA、Python等三種編程語言,但可以找到大量的幾乎涵蓋所有語言的第三方拓展包。

 

同為數據的存儲格式,和json相比,Protocol Buffers的優點主要體現在性能和體積上,性能方面需要實際的測試,暫且不說,數據體積方面的優勢是比較明顯的,例如,一個json文件:

 

  1. [
  2. {"Name": "zhangsan", "Gender": 0, "Age": 18},
  3. {"Name": "lisi", "Gender": 1, "Age": 19}
  4. ]

 

再看一個protobuf文件:

 

  1. message Person {
  2. required string Name = 1;
  3. optional int32 Gender = 2;
  4. optional int32 Age = 3;
  5. }

 

json文件的問題在於無效數據太多,例如Name 和Gender 等,這些內容大量重復出現,使得數據體積較大。再看protobuf文件,它使用一個唯一的id(數字)來代替json里復雜的key,這樣只要數據發送方和接受方都按同一套“模板”解析數據,就可以大大縮短報文體積。

 

ProtoBuf.js

ProtoBuf.js是基於ByteBuffer.js的Protocol Buffers純Javascript實現。主要功能是解析.proto 文件,構建message類,和簡單的編碼、解碼。目前在一個node-webkit中使用protobuf格式於服務端進行數據交互(服務端是按照舊c++客戶端要求實現的protobuf)。

 

 

目前對ProtoBuf.js的使用主要就是讀取舊的.proto 文件,創建message類,編碼,發送給服務端,如下:

 

user.proto 文件:

  1. package protobuf;
  2.  
  3. message UserModel {
  4. required string cyUserno = 1;
  5. required string cyPassWord = 2;
  6. required string cyStatus = 3;
  7. }

 

nodejs代碼:

  1. var fs = require("fs"),
  2. ProtoBuf = require("protobufjs"),
  3. userProtoStr = fs.readFileSync('./user.proto').toString(),
  4. UserModel = ProtoBuf.loadProto(userProtoStr).build('protobuf').UserModel,
  5. userModel;
  6.  
  7. userModel= new UserModel();
  8. userModel.set('cyUserno', '111111');
  9. userModel.set('cyPassWord', '123456');
  10. userModel.set('cyStatus', '1');
  11.  
  12. var buffer = userModel.encode().toBuffer();

 

解碼的方法也很簡單:

 

  1. var userInfo = UserModel.decode(data);
  2.  
  3. userInfo.get('cyUserno');
  4. ......

 

另外protobuf.js還提供了一些工具,例如.proto 和.json 的轉換等,具體參看他的官網:https://github.com/dcodeIO/ProtoBuf.js

 

- 完 -


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM