Protobuf 生成 Go Java Javascript 等文件
protobuf 简介
protobuf (protocol buffer)
是谷歌内部的混合语言数据标准。通过将结构化的数据进行序列化(串行化),用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。
ProtoBuf
中的数据是按顺序进行排列,而整体的结构为若干个field
,每一个field
中由Tag-[Length]-Value
组成。Length是可选的,而是否存在Length
是通过Tag
的类型来决定的。也就是说如果是指定的类型,比如int64
,那我们就可以知道Value
的长度,也就不用在依靠Length
来对其空间进行描述。
对比 JSON 和 XML
- XML、JSON、Protobuf 都具有数据结构化和数据序列化的能力
- XML、JSON 更注重 数据结构化,关注人类可读性和语义表达能力。- - - - Protobuf 更注重 数据序列化,关注效率、空间、速度,人类可读性差,语义表达能力不足
- Protobuf 的应用场景更为明确,XML、JSON 的应用场景更为丰富
protobuf
的优点
- 跨平台、跨语言、可扩展性强
- 序列化速度快,传输速度快,序列化后,数据大小可缩小3倍
- 使用简单:proto编译器自动进行序列化和反序列化
- 维护成本低:多平台只需要维护一套对象协议文件,即.proto文件
- 可扩展性好:不必破坏旧的数据格式,就能对数据结构进行更新
- 加密性好:http传输内容抓包只能抓到字节数据
各语言类型对照表
关于默认值
proto3
中,数据的默认值不再支持自定义,而是由程序自行推倒:
string
:默认值为空bytes
:默认值为空bools
:默认值为 falsenumeric
:默认值为 0enums
: 默认为定义的第一个元素,并且编号必须为 0message
类型:根据生成的不同语言有不同的表现,参考 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
安装
案例
执行命令生成 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引入有效消息的概念,以便提供最佳的性能。
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
环境变量
参考资料
真诚点赞 诚不我欺~