来自谷歌的序列化方式-Protobuf

一、什么是Protobuf

Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准,目前已经正在使用的有超过 48,162 种报文格式定义和超过 12,183 个 .proto 文件。他们用于 RPC 系统和持续数据存储系统。

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

jsonxml如出一辙,之所以要学习protobuf是因为这种序列化方式得到的数据体积是很小的,这就导致了它在网络传输性能以及存储方面的优势;因为体积小,让protobuf序列化的数据传输性能高,磁盘占用率也低;所以protobuf序列化的场景一般出现在高性能业务中,基本上是通过tcp+protobuf的通信方式取代http+json

二、举个栗子🌰

编写protobuf之前,需要使用先下载protoc工具,将proto转换为目标语言需要的代码。

image-20231031105853793

2.1安装protoc

下载地址:https://github.com/protocolbuffers/protobuf/releases/

  1. 下载对应系统的protoc版本

image-20231031154711797

  1. 设置环境变量

    image-20231031154909757

    image-20231031155007866

  2. 检查是否安装成功

    protoc –version

    image-20231031155123217

2.2转换

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
// 使用proto3语法
syntax = "proto3";
// 生成多个类
option java_multiple_file = false;
// 生成Java类所在的包名
option java_package = "com.dcz.news";
// 生成外层类类名
option java_outer_classname = "NewsProto";
// 逻辑包名
package news;
// service服务,用于描述要生成的API接口,类似Java的业务逻辑接口类
service NewsService {
// rpc方法(参数类型) returns (返回类型){}
rpc list(NewsRequest) returns (NewsResponse) {}
}

message NewsRequest {
/*
字段:类型 名称 = 索引值(id)
每个字段都要定义唯一的索引值,这些数字是用来在消息的二进制格式中识别各个字段的。
一旦开始使用就不能再改变,最小的标识号可以从1开始,最大到2^29-1(536870911)
不可以使用其中的(19000-19999)的标识号,Protobuf协议实现中对这些进行了预留
切记:要为将来可能添加的、频繁出现的标识号预留一些标识号
*/
string date = 1;
}

message NewsResponse {
// repeated是指一个集合(数组),数组每一个元素都是News对象
// List<News> getNewsList();
repeated News news = 1;
}

message News {
int32 id = 1;
string title = 2;
string content = 3;
int64 createTime = 4;
}

转换命令

1
protoc --java_out=. News.proto

转换结果

image-20231031155336870

1
2
3
4
5
6
7
8
9
10
本文为个人知识学习,非原创!非作者!如本博客有侵权行为,请与我联系。
摘录以下文章,内容根据个人需求有所删减,尊重知识产出,尊重作者知识劳动成果。

作者:梦想实现家_Z
链接:https://juejin.cn/post/7208018784073547832
作者:CCP加油站
链接:https://zhuanlan.zhihu.com/p/141415216
作者:IT老齐
链接:https://www.bilibili.com/video/BV1FZ4y187W7
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。