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
}
]
}
- Code2Cloud:比ALM中断更大
- .NET Core的日志[4]:将日志写入EventLog
- 微信小程序不行了?看小马哥带你忆童年
- ASP.NET MVC三个重要的描述对象:ControllerDescriptor和ActionDescriptor的创建
- .NET Core的日志[5]:利用TraceSource写日志
- 物联网芯片正在积极开发 明年将得到爆发
- 韩国全球首测5G网络下自动驾驶 为汽车安全保驾护航的竟是路灯
- 通过与Quickbuild和Mist.io的持续集成实现云管理和使用监控
- .NET Core的文件系统[1]:读取并监控文件的变化
- ASP.NET MVC以ValueProvider为核心的值提供系统: ValueProviderFactory
- 云本机应用程序成熟度的模型
- 如何利用ETW(Event Tracing for Windows)记录日志
- 如何利用ETW(Event Tracing for Windows)记录日志
- 如何利用ETW(Event Tracing for Windows)记录日志
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 详解Gson的TypeToken原理
- 时间序列分解和异常检测方法应用案例
- 为什么机器学习应用交易那么难(上)
- 快速学习-sentinel动态规则扩展
- Git-git diff命令结果解析
- 快速学习-sentinel实时监控
- Git技术干货!工作中Git的使用实践和常用命令合集!
- gremlin-both()与bothE().bothV()的区别
- C# Time.deltaTime 增量时间
- Docker--docker ps 命令与结果解析
- Junit5系列-Junit5中@DisplayName自定义名称
- Junit5系列-Junit5中Assertions断言类
- 使用libev监视文件夹下文件(夹)属性变动的方案和实现
- C++拾取——stl标准库中集合交集、并集、差集、对称差方法
- netty结合Protostuff传输对象案例,单机压测秒级接收35万个对象