前言
protocol-buffers 是 node.js 平台對支持 protobuf 封裝的三方模塊,下面的例子都通過 protocol-buffers 的使用來說明。
什么是protobuf
Google Protocol Buffer( 簡稱 Protobuf) 是 Google 公司內部的混合語言數據標准,與 XML 和 JSON 數據格式類似,但采用的是二進制的數據格式,具有更高的傳輸,打包和解包效率,它們用於 RPC 系統和持續數據存儲系統。
Protocol Buffers 是一種輕便高效的結構化數據存儲格式,可以用於結構化數據串行化,或者說序列化。它很適合做數據存儲或 RPC 數據交換格式。可用於通訊協議、數據存儲等領域的語言無關、平台無關、可擴展的序列化結構數據格式。
如何使用protocol-buffers
1.編寫.proto文件
該文件規定了數據的格式、類型等,語法在后面會寫到
message Data { required string name = 1; required int32 id = 2; required bool sex = 3; required float money = 4; }
2.編碼
const protobuf = require('protocol-buffers')
const fs = require('fs')
let schema = protobuf(fs.readFileSync(__dirname+'/data.proto','utf-8'))
let buf = schema.Data.encode({
id:1,
name:'Joe',
sex: true,
money: 58.8
})
console.log(buf)
引入下載好的protocol-buffers模塊,schema為傳入.proto文件后生成的Message對象,里面有對應的編解碼方法。
schema.Data 的名稱和.proto文件內寫的message對象名稱要一致
調用encode方法,傳入的數據格式類型和.proto文件的保持一致,編碼之后會得到一個buffer
<Buffer 0a 03 4a 6f 65 10 01 18 01 25 33 33 6b 42>
3.解碼
schema.Data.decode(buf)
調用decode方法,傳入buffer解碼出對應的數據對象
.proto文件語法
字段規則
- required: 格式良好的 message 必須包含該字段一次
- optional: 格式良好的 message 可以包含該字段零次或一次(不超過一次)。
- repeated: 該字段可以在格式良好的消息中重復任意多次(包括零)。其中重復值的順序會被保留。
字段定義組成
message Data { optional int32 id = 1[default = 10]; }
- optional: 字段規則
- int32: 字段類型
- id: 字段名稱
- 1: 唯一標識符
- [default = 10]: 可選的選項
缺省值
在未接收到數據時會得到默認值
- int: 0
- string: 空字符
- bool: false
- enum: 枚舉的第一項
枚舉enum
枚舉規定字段值在預定義的值列表中,值為大於等於0的整數
enum Fruits{ APPLE = 1; BANANA = 2; CHERRY = 3; } message Data { Fruits fruits = 1[defalut = BANANA]; }
對應js格式:
{ fruits: 1 } 或 { fruits: 2 } 或 { fruits: 3 }
嵌套的message
message Works { string work = 1; } message Data { string name = 1; int32 id = 2; Works works = 3; }
對應js格式:
{ name: 'Joe', id: 1, works: { work: 'worker' } }
repeated(基本類型)
message Data { repeated int32 nums = 1; }
對應js格式:
{ nums: [1,2,3,4,5] }
repeated(嵌套message)
message People { string name = 1; int32 height = 2; } message Data { repeated People people = 1; }
對應js格式:
{ people: [ { name: 'Mike', height: 180 }, { name: 'Joe', height: 190 } ] }
