添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
低代码开发🔥 MybatisPlus🌽
文章

Protobuf 生成 Go Java Javascript 等文件

青苗 青苗 | 1040 | 2022-10-21

protobuf 简介

protocol-buffers 官网

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 :默认值为 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 安装

    执行命令生成 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 环境变量

    Protobuf3 语法指南
    protobufjs 使用方法

    推荐指数:

    真诚点赞 诚不我欺~ Protobuf 生成 Go Java Javascript 等文件 点赞 收藏 评论