写点什么

[protobuf 笔记]01- 认识 protobuf

作者:南吕
  • 2022 年 5 月 30 日
  • 本文字数:1175 字

    阅读完需:约 4 分钟

Protocol Buffer 简称 Protobuf 。 是 Google 出品的性能优异、跨语言、跨平台的序列化库。

序列化

序列化,就是将数据结构或对象的状态转换成可以存储或传输的格式。比如将数据存储为文件,或存储到内存中。传输的格式,比如网络传输。

反向操作就是反序列化。

Protobuf 历史

  • proto1 :初代版本,仅在 Google 内部使用,且几乎所有开发者都会使用它。

  • proto2 :由于依赖关系,Google 将其开源。开发者重写了 Protobuf 的实现,保留了 Proto1 的设计,开源的 Protobuf 不依赖任何库,代码更清晰。

  • proto3 :简化 proto2 的开发,提高了开发的效能,但是存在和 proto2 不兼容的问题

Protobuf 优势

经常在项目中使用最多的是在 HTTP 请求时会使用 JSON/XML 格式进行传输。当然还有很多其他格式,可能你接触的比较少。比如,BSON、Thrift、Avro 等等。

在对比各种序列化库,包含对比序列化和反序列化的性能,以及序列化后的数据大小。总体来说,有很多很有利的优势:

  • Protobuf 序列化和反序列化的性能是最高的。

  • protobuf 是二进制格式,所以编码后的数据比 json/xml 还小。

  • 目前 Protobuf 支持很多语言,也是支持跨平台,被广泛应用。

安装 Protobuf 编译器

安装

// 直接安装或者指定版本号 brew install protobuf@3.19.0brew install protobuf // 安装完后查看版本号 protoc --version复制代码
复制代码

编译成指定语言类库

protoc 编译器支持将 proto 文件编译成多种语言版本的代码。生成类库的命令:

protoc --proto_path=IMPORT_PATH --<lang>_out=DST_DIR path/to/file.proto复制代码
复制代码
  • --proto_path=IMPORT_PATH:可以在 .proto 文件中 import 其他的 .proto 文件,proto_path 即用来指定其他 .proto 文件的查找目录。如果没有引入其他的 .proto 文件,该参数可以省略。

  • --<lang>_out=DST_DIR:指定生成代码的目标文件夹,例如 –go_out=. 即生成 GO 代码在当前文件夹,另外支持 cpp/java/python/ruby/objc/csharp/php 等语言

下一篇详细说明各语言类库生成方法。

Protonuf Demo

新建一个 demo.proto 文件

// 指定 proto 版本synatx = "proto3"// 定义数据结构message SearchRequest {  string query = 1;  int32 page_number = 2;  int32 result_per_page = 3;}复制代码
复制代码
  • 第一行,指定 protobuf 的版本,如果没有指定版本将默认是 proto2 格式。

  • 定义了一个 message 类型的数据结构:SearchRequest。

参考资料

一些其他的资料:

  1. protobuf 代码仓库 - github.com

  2. golang protobuf 代码仓库 - github.com

  3. Remote procedure call 远程过程调用 - wikipedia.org

  4. Groupcache Go语言版 memcached - github.com

  5. Language Guide (proto3) 官方指南 - google.com

  6. Proto Style Guide 代码风格指南 - google.com

  7. Protocol Buffer 插件列表 - github.com

发布于: 刚刚阅读数: 3
用户头像

南吕

关注

你我皆凡人 2019.05.10 加入

hi,Jasen

评论

发布
暂无评论
[protobuf 笔记]01- 认识 protobuf_protobuf_南吕_InfoQ写作社区