protobuf 語法 與 protocol-buffers 的使用


前言

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
    }
  ]
}

 


免責聲明!

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



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