前言

protocol-buffers 是 node.js 平台对支持 protobuf 封装的三方模块,下面的例子都通过 protocol-buffers 的使用来说明。

什么是protobuf

Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准,与 XML 和 JSON 数据格式类似,但采用的是二进制的数据格式,具有更高的传输,打包和解包效率,它们用于 RPC 系统和持续数据存储系统。

Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或 RPC 数据交换格式。可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。

如何使用protocol-buffers

1.编写.proto文件

该文件规定了数据的格式、类型等,语法在后面会写到

  1. message Data {
  2. required string name = 1;
  3. required int32 id = 2;
  4. required bool sex = 3;
  5. required float money = 4;
  6. }

2.编码

  1. const protobuf = require('protocol-buffers')
  2. const fs = require('fs')
  3. let schema = protobuf(fs.readFileSync(__dirname+'/data.proto','utf-8'))
  4.  
  5. let buf = schema.Data.encode({
  6. id:1,
  7. name:'Joe',
  8. sex: true,
  9. money: 58.8
  10. })
  11. 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.解码

  1. schema.Data.decode(buf)

调用decode方法,传入buffer解码出对应的数据对象

.proto文件语法

字段规则

  • required: 格式良好的 message 必须包含该字段一次
  • optional: 格式良好的 message 可以包含该字段零次或一次(不超过一次)。
  • repeated: 该字段可以在格式良好的消息中重复任意多次(包括零)。其中重复值的顺序会被保留。

字段定义组成

  1. message Data {
  2. optional int32 id = 1[default = 10];
  3. }
  • optional: 字段规则
  • int32: 字段类型
  • id: 字段名称
  • 1: 唯一标识符
  • [default = 10]: 可选的选项

缺省值

在未接收到数据时会得到默认值

  • int: 0
  • string: 空字符
  • bool: false
  • enum: 枚举的第一项

枚举enum

枚举规定字段值在预定义的值列表中,值为大于等于0的整数

  1. enum Fruits{
  2. APPLE = 1;
  3. BANANA = 2;
  4. CHERRY = 3;
  5. }
  6. message Data {
  7. Fruits fruits = 1[defalut = BANANA];
  8. }

对应js格式:

  1. {
  2. fruits: 1
  3. }

  4. {
  5. fruits: 2
  6. }

  7. {
  8. fruits: 3
  9. }

嵌套的message

  1. message Works {
  2. string work = 1;
  3. }
  4. message Data {
  5. string name = 1;
  6. int32 id = 2;
  7. Works works = 3;
  8. }

对应js格式:

  1. {
  2. name: 'Joe',
  3. id: 1,
  4. works: {
  5. work: 'worker'
  6. }
  7. }

repeated(基本类型)

  1. message Data {
  2. repeated int32 nums = 1;
  3. }

对应js格式:

  1. {
  2. nums: [1,2,3,4,5]
  3. }

repeated(嵌套message)

  1. message People {
  2. string name = 1;
  3. int32 height = 2;
  4. }
  5. message Data {
  6. repeated People people = 1;
  7. }

对应js格式:

  1. {
  2. people: [
  3. {
  4. name: 'Mike',
  5. height: 180
  6. },
  7. {
  8. name: 'Joe',
  9. height: 190
  10. }
  11. ]
  12. }

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. nyoj 71-独木舟上的旅行(贪心)

    71-独木舟上的旅行 内存限制:64MB 时间限制:3000ms 特判: No 通过数:10 提交数:15 难度:2 题目描述: 进行一次独木舟的旅行活动,独木舟可以在港口租到,并且之间没有区别.一条 ...

  2. JPA中使用@Query注解多表联查

    原生SQL: select `user`.id, `user`.`name`,dept.name deptName,sum(sd.score) SumScore from `user` LEFT JO ...

  3. 优秀的github项目学习

    优秀的github项目学习 后期会陆续添加遇到的优秀项目 https://github.com/chaijunkun

  4. java多线程,多线程加锁以及Condition类的使用

    看了网上非常多的运行代码,很多都是重复的再说一件事,可能对于java老鸟来说,理解java的多线程是非常容易的事情,但是对于我这样的菜鸟来说,这个实在有点难,可能是我太菜了,网上重复的陈述对于我理解这 ...

  5. 2-SAT习题讲解

    2-SAT习题讲解 讲在前面:下述例题不是按照难度顺序的,而且基本就只会讲解建图的过程.下面讲解中$A'$为$A$的反向状态. 一.bzoj习题 例一:$bzoj2199 奶牛议会$ 首先我们考虑本题 ...

  6. deepin安装pip

    sudo apt install python3-venv python3-pip  升级最新版 pip3 install --upgrade pip 更新完以后就报错网上的解决办法没有好使的 退回版 ...

  7. python3 之 面向对象(类)、继承、派生和多态

    类提供了一种 组合数据和功能 的方法.创建一个新类意味着:创建一个新 类型  的对象,从而允许创建一个该类型的新 实例. 每个类的实例可以拥有: 保存自己状态的属性. 一个类的实例也可以有改变自己状态 ...

  8. 【Luogu P1090】合并果子

    Luogu P1090 [解题思路] 刚看到这题的时候,第一反应就是每次取两个最小,然后重新排序,再取最小.但是这样会TLE. 既然找最小的,那就可以利用单调队列了.显然输入的数据是不具有单调性的,但 ...

  9. Tesseract处理规范的文字

  10. c# 基于DataTable的Compute方法的扩展

    DataTable.Compute(String, String) 方法 定义 命名空间:System.Data 程序集:System.Data.dll, netstandard.dll, Syste ...