前言

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 的使用的更多相关文章

  1. ProtoBuf3语法指南(Protocol Buffers)_下

    0.说明 ProtoBuf3语法指南, 又称为proto3, 是谷歌的Protocol Buffers第3个版本. 本文基于官方英文版本翻译, 加上了自己的理解少量修改, 一共分为上下两部分. 1.A ...

  2. ProtoBuf3语法指南(Protocol Buffers)_上

    0.说明 ProtoBuf3语法指南, 又称为proto3, 是谷歌的Protocol Buffers第3个版本. 本文基于官方英文版本翻译, 加上了自己的理解少量修改, 一共分为上下两部分. 1.序 ...

  3. DELPHI、FLASH、AS3、FLEX使用Protobuf(google Protocol Buffers)的具体方法

    最近因为工作需要,需要在不同的开发环境中应用Protobuf,特此,我专门研究了一下.为了防止自己忘记这些事情,现在记录在这里!需要的朋友可以借鉴一些,因为这些东西在GOOGLE和百度上搜索起来真的很 ...

  4. Protocol Buffers(Protobuf)开发者指南---概览

    Protocol Buffers(Protobuf)开发者指南---概览 欢迎来到protocol buffers的开发者指南文档,protocol buffers是一个与编程语言无关‘.系统平台无关 ...

  5. Google Protocol Buffers介绍

    简要介绍和总结protobuf的一些关键点,从我之前做的ppt里摘录而成,希望能节省protobuf初学者的入门时间.这是一个简单的Demo. Protobuf 简介 Protobuf全称Google ...

  6. 【笔记】golang中使用protocol buffers的底层库直接解码二进制数据

    背景 一个简单的代理程序,发现单核QPS达到2万/s左右就上不去了,40%的CPU消耗在pb的decode/encode上面. 于是我想,对于特定的场景,直接从[]byte中取出字段,而不用完全的把整 ...

  7. Protocol Buffers(Protobuf) 官方文档--Protobuf语言指南

    Protocol Buffers(Protobuf) 官方文档--Protobuf语言指南 约定:为方便书写,ProtocolBuffers在下文中将已Protobuf代替. 本指南将向您描述如何使用 ...

  8. protobuf Protocol Buffers 简介 案例 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  9. 无责任比较thrift vs protocol buffers

    http://blog.csdn.net/socoolfj/article/details/3855007 最新版本的Hadoop代码中已经默认了Protocol buffer作为RPC的默认实现,原 ...

  10. 开源点评:Protocol Buffers介绍

    今天来介绍一下“Protocol Buffers”(下面简称protobuf)这个玩意儿.本来俺在构思“生产者/消费者模式 ”系列的下一个帖子:关于生产者和消费者之间的传输数据格式.因为里面扯到了pr ...

随机推荐

  1. js数组方法大全(下)

    # js数组方法大全(下) 记录一下整理的js数组方法,免得每次要找方法都找不到.图片有点多,注意流量,嘻嘻! 本期分享 forEach() map() filer() every() some() ...

  2. 怎么把CAT客户端的RootMessageId记录到每条日志中?

    什么是RootMessageId? 为了理解RootMessageId先简单介绍一下CAT的数据结构设计.CAT客户端会将所有消息都封装为一个完整的消息树(MessageTree),消息树可能包括Tr ...

  3. 语义分割学习之SegNet的C++编译

    Abstract 安装好Segnet并使用Python进行训练和测试之后,考虑项目的应用,需要在C++的工程环境下进行继续开发,所以这里的主要内容是用C++建立工程,使用相应的数据集和权重参数文件进行 ...

  4. Spring Boot2 系列教程(二十五)Spring Boot 整合 Jpa 多数据源

    本文是 Spring Boot 整合数据持久化方案的最后一篇,主要和大伙来聊聊 Spring Boot 整合 Jpa 多数据源问题.在 Spring Boot 整合JbdcTemplate 多数据源. ...

  5. C语言博客I作业09

    提问 回答 这个作业属于哪个课程 C语言程序设计Ⅱ 这个作业要求在哪里 https://www.cnblogs.com/sanying/p/11907721.html 我在这个课程的目标 掌握语句嵌套 ...

  6. 0MQ是会阻塞的,不要字面上看到队列就等同非阻塞。

    如果你是希望通过0MQ来做缓冲队列,非阻塞的效果,那你就必须清楚 0MQ Socket是会阻塞,你要搞清楚0MQ Socket与队列的关系. 官方协议文档规定了,一部分类型的 0MQ Socket为不 ...

  7. opencv 4 图像处理(2 形态学滤波:腐蚀与膨胀,开运算、闭运算、形态学梯度、顶帽、黑帽)

    腐蚀与膨胀 膨胀(求局部最大值)(dilate函数) #include <opencv2/core/core.hpp> #include <opencv2/highgui/highg ...

  8. vim-plug golang定义跳转godef

    go get -v github.com/rogpeppe/godef go install -v github.com/rogpeppe/godef ~/.config/nvim/init.vim ...

  9. echarts绘制彩虹色背景

    大致成品如图所示 关键的步骤: var dom = document.getElementById("myChart"); var myChart = echarts.init(d ...

  10. vue 原生添加滚动加载更多

    vue中添加滚动加载更多,因为是单页面所以需要在跳出页面时候销毁滚动,要不会出现错乱.我们在mounted建立滚动,destroyed销毁滚动. mounted () { window.addEven ...