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
}
]
}
protobuf 语法 与 protocol-buffers 的使用的更多相关文章
- ProtoBuf3语法指南(Protocol Buffers)_下
0.说明 ProtoBuf3语法指南, 又称为proto3, 是谷歌的Protocol Buffers第3个版本. 本文基于官方英文版本翻译, 加上了自己的理解少量修改, 一共分为上下两部分. 1.A ...
- ProtoBuf3语法指南(Protocol Buffers)_上
0.说明 ProtoBuf3语法指南, 又称为proto3, 是谷歌的Protocol Buffers第3个版本. 本文基于官方英文版本翻译, 加上了自己的理解少量修改, 一共分为上下两部分. 1.序 ...
- DELPHI、FLASH、AS3、FLEX使用Protobuf(google Protocol Buffers)的具体方法
最近因为工作需要,需要在不同的开发环境中应用Protobuf,特此,我专门研究了一下.为了防止自己忘记这些事情,现在记录在这里!需要的朋友可以借鉴一些,因为这些东西在GOOGLE和百度上搜索起来真的很 ...
- Protocol Buffers(Protobuf)开发者指南---概览
Protocol Buffers(Protobuf)开发者指南---概览 欢迎来到protocol buffers的开发者指南文档,protocol buffers是一个与编程语言无关‘.系统平台无关 ...
- Google Protocol Buffers介绍
简要介绍和总结protobuf的一些关键点,从我之前做的ppt里摘录而成,希望能节省protobuf初学者的入门时间.这是一个简单的Demo. Protobuf 简介 Protobuf全称Google ...
- 【笔记】golang中使用protocol buffers的底层库直接解码二进制数据
背景 一个简单的代理程序,发现单核QPS达到2万/s左右就上不去了,40%的CPU消耗在pb的decode/encode上面. 于是我想,对于特定的场景,直接从[]byte中取出字段,而不用完全的把整 ...
- Protocol Buffers(Protobuf) 官方文档--Protobuf语言指南
Protocol Buffers(Protobuf) 官方文档--Protobuf语言指南 约定:为方便书写,ProtocolBuffers在下文中将已Protobuf代替. 本指南将向您描述如何使用 ...
- protobuf Protocol Buffers 简介 案例 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- 无责任比较thrift vs protocol buffers
http://blog.csdn.net/socoolfj/article/details/3855007 最新版本的Hadoop代码中已经默认了Protocol buffer作为RPC的默认实现,原 ...
- 开源点评:Protocol Buffers介绍
今天来介绍一下“Protocol Buffers”(下面简称protobuf)这个玩意儿.本来俺在构思“生产者/消费者模式 ”系列的下一个帖子:关于生产者和消费者之间的传输数据格式.因为里面扯到了pr ...
随机推荐
- 小白学 Python(23):Excel 基础操作(上)
人生苦短,我选Python 前文传送门 小白学 Python(1):开篇 小白学 Python(2):基础数据类型(上) 小白学 Python(3):基础数据类型(下) 小白学 Python(4):变 ...
- libpcap的下载与安装(apt-get安装unable to locate package 的解决方法(Ubantu))
因为网络安全课的实验课要求,我们得下载libcap我们得做一个类似于tcpdump的一个东西.具体要求就不贴出来了. libpcap只能在官网(www.tcpdump.org)下到,我用的os是Ubu ...
- PHPExcel数据导入(含图片)
PHPExcel是一个PHP类库,用来帮助我们简单.高效实现从Excel读取Excel的数据和导出数据到Excel. 首先下载压缩包: https://codeload.github.com/PHPO ...
- C#: 统计method的执行时间
对于性能分析来说,无非是内存占用,CPU使用和执行时间. 那么,对于执行时间(elapsed times)的测量,需要强调的是,尽量不要使用DateTime类来,而是应该使用Stopwatch 类.M ...
- T-SQL Part V: Locks
写SQL最常见的问题就是Dead Lock了.本篇简单介绍入门级别的Lock使用和排查. 首先来看MSDN上的官方文档(https://technet.microsoft.com/en-us/libr ...
- 力扣(LeetCode)Excel表列序号 个人题解
给定一个Excel表格中的列名称,返回其相应的列序号. 例如, A -> 1 B -> 2 C -> 3 ... Z -> 26 AA -> 27 AB -> 28 ...
- shell脚本2——控制语句
1.顺序结构体 命令从上往下顺序执行 2.分支结构体 1)判断真假 test 表达式 或者 [ 表达式 ](必须有空格) 真返回0,假返回1 test的别名是[, 参数是] 判断表达式 记忆 解释 ! ...
- android逆向总结
首先项目里的java文件,以及项目引用到的第三方jar或aar包里面的class,统统都编译成classes.dex放在apk包的根目录,项目的资源目录和AndroidManifest.xml被处理生 ...
- 2C 还是 2B,跟找工作有什么关系?
通常,我们会把公司的业务类型分成以下几种: 2C,to Customer,指面向个人客户的业务,即将公司的产品或服务销售给个人,通常做出购买决策的个人也是使用产品或服务的用户.举例说明,像 BAT 发 ...
- PostGIS 爆管分析之根据爆点找出所有影响阀门
环境: Win10 ArcMap10.4(用于数据处理) postgresql9.4 postgis2.2.3 pgRouting2.3(postgresql插件) 说明: 做爆管分析的第一步,需要先 ...