Protobuf 生成 Go Java Javascript 等文件

青苗 青苗 | 3127 | 2022-10-21

protobuf 简介

protocol-buffers 官网

protobuf (protocol buffer) 是谷歌内部的混合语言数据标准。通过将结构化的数据进行序列化(串行化),用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。

3f3fca408c324376bec46e03d6ecf00b.png

ProtoBuf中的数据是按顺序进行排列,而整体的结构为若干个field,每一个field中由Tag-[Length]-Value组成。Length是可选的,而是否存在Length是通过Tag的类型来决定的。也就是说如果是指定的类型,比如int64,那我们就可以知道Value的长度,也就不用在依靠Length来对其空间进行描述。

对比 JSON 和 XML

  • XML、JSON、Protobuf 都具有数据结构化和数据序列化的能力
  • XML、JSON 更注重 数据结构化,关注人类可读性和语义表达能力。- - - - Protobuf 更注重 数据序列化,关注效率、空间、速度,人类可读性差,语义表达能力不足
  • Protobuf 的应用场景更为明确,XML、JSON 的应用场景更为丰富

a91c42fb296f49a8b92e434099ee3dcb.png

protobuf的优点

  • 跨平台、跨语言、可扩展性强
  • 序列化速度快,传输速度快,序列化后,数据大小可缩小3倍
  • 使用简单:proto编译器自动进行序列化和反序列化
  • 维护成本低:多平台只需要维护一套对象协议文件,即.proto文件
  • 可扩展性好:不必破坏旧的数据格式,就能对数据结构进行更新
  • 加密性好:http传输内容抓包只能抓到字节数据

各语言类型对照表

0fbc23a654e34aa792f5da1e038c55a4.png

关于默认值 proto3 中,数据的默认值不再支持自定义,而是由程序自行推倒:

  • string:默认值为空
  • bytes:默认值为空
  • bools:默认值为 false
  • numeric:默认值为 0
  • enums: 默认为定义的第一个元素,并且编号必须为 0
  • message 类型:根据生成的不同语言有不同的表现,参考 generated code guide

包声明

  • proto 文件以 package 声明开头,这有助于防止不同项目之间命名冲突。

字段规则

  • required:消息体中必填字段,不设置会导致编解码异常。
  • optional: 消息体中可选字段,可通过default关键字设置默认值。
  • repeated: 消息体中可重复字段,重复的值的顺序会被保留(例如位置3)。其中,proto3默认使用packed方式存储,这样编码方式比较节省内存。

标识号

  • 标识号:在消息体的定义中,每个字段都必须要有一个唯一的标识号,标识号是[0,2^29-1]范围内的一个整数。以Person为例,id=1,name=2, email=3 中的1-3就是标识号。

安装编译

  • protoc 官方下载 然后将 bin 路径添加到 path 环境变量下去,本文下载 protoc-21.8-win64.zip

  • 查看是否安装成功:控制台输入 protoc --version ,控制台输出版本信息代表成功,如: libprotoc 3.21.8

  • ideal 安装插件【可选,为了查看方便】 插件库搜索 Protobuf 安装

0025f0cc3af84996a008db68334a8d90.png

案例

执行命令生成 Java 文件

  • proto3 协议 User.proto 文件内容:
syntax="proto3";
package demo;

message LoginRequest{
	string username = 1;
	string password = 2;
}

命令 protoc -I=./ --java_out=./ User.proto 参数 -I:.proto 文件的位置。 --java out 输出位置会以完整包名的形式出输出 User.proto 需要编译成java的proto文件。

执行命令生成 Golang 文件

安装一个官方生成 Golang 代码的插件 protoc-gen-go 命令 go get -u github.com/golang/protobuf/protoc-gen-go 注意 GOBIN 添加到环境变量不然找不到 protoc-gen-go 执行命令

  • proto3 协议 User.proto 文件内容:
synax="proto3";
package demo;
// 注意 golang 中要添加下面这行代码指定包的位置
option go_package = "./";

message LoginRequest{
	string username = 1;
	string password = 2;
}

执行命令 protoc -I=./ --go_out=./ User.proto 当前目录生成 User.pb.go 文件

执行命令生成 Javascript 文件

由于JavaScript是一种动态类型语言, protobuf.js引入有效消息的概念,以便提供最佳的性能。

04e91a19977a45e695523521b82628eb.png

nodejs 全局安装 pbjs 官方文档 包含详细说明

  • 执行命令 npm install -g pbjs 全局安装
  • 生成 es6 js 文件 pbjs User.proto --es6 User.js
  • 生成 ts 文件 pbjs User.proto --ts User.ts

如果 npm -g 安装 pbjs 命令找不到,执行 npm prefix -g 命令找到路径配置到 path 环境变量

参考资料

Protobuf3 语法指南
protobufjs 使用方法

推荐指数:

真诚点赞 诚不我欺~

Protobuf 生成 Go Java Javascript 等文件

点赞 收藏 评论

关于作者

青苗
青苗

青苗幼儿园园长

等级 LV5

粉丝 20

获赞 47

经验 1182