Untitled

Protobuf编码过程:使用预先定义好的Message数据结构将实际的传输数据进行打包,然后编码成二进制流进行传输和存储。

Protobuf解码过程:将二进制流解码成Protobuf自己定义的Message结构的POJO实例

序列化:ProtoBuf 与 JSON 的比较 ! - 知乎 (zhihu.com)

编写proto文件

在proto文件中,使用message关键字来定义消息的结构体。在生成proto对应的Java代码时,每个具体的消息结构体将对应于一个最终的Java POJO类。

// [头部声明]
syntax = "proto3";
package com.example.protobuf;

// [Java选项配置]
option java_package = "com.example.protobuf";
option java_outer_classname = "MsgProto";

// [消息定义]
message Msg {
  uint32 id = 1;
  string content = 2;
}

在一个proto文件中可以声明多个message,大部分情况下会把存在依赖关系或者包含关系的message结构体写入一个proto文件,将那些没有关系、相互独立的message结构体分别写入不同的文件,这样便于管理。

package

通过package,还可以实现消息的引用。

假设另一个proto文件也定义了一个相同名字的消息,package包名如下:

package com.example2.protobuf
message Msg {
	...
	com.example.protobuf.Msg crazyMsg = 1;
	...
}

在第二个proto文件中,可以用“包名+消息名称”(全限定名)来引用第一个proto文件中的Msg结构体

package指定包名后会对应到生成的消息POJO代码和Builder代码。在Java语言中,会以package指定的包名作为生成的POJO类的包名。

生成POJO和Builder