Protobuf - 命令行用法

Protobuf 序列化数据并以二进制格式存储。如果我们只处理 字符串,这可能不是问题,因为 Protobuf 最终使用 UTF-8。因此,如果您使用启用 UTF8 的阅读器,它存储的任何文本都是人类可读的。但是,int32、布尔值、列表、映射 等内容使用特定技术进行编码以减少空间消耗。

这就是为什么有时通过简单的命令行实用程序对消息进行编码/解码对于测试目的很有用。让我们看看实际效果 −

假设我们使用以下简单的 "greeting_cli.proto"

syntax = "proto3";
package tutorial;
option java_package = "com.tutorialspoint.greeting";

message Greet {
   string greeting = 1;
   string username = 2;
   int32 age = 3;
}  

我们在 cli_greeting_message 中创建一条消息 −

greeting: "Yo"
username : "John"
age : 50

现在,让我们使用 Protobuf CLI 工具对此消息进行编码 −

cat  .\cli_greeting_msg.proto |  protoc  --encode=tutorial.Greet .\greeting_cli.proto > encoded_greeting

If we look at what is inside this file or cat this file −

cat .\encoded_greeting

☻Yo↕♦John↑2

除了 "Yo""John" 之外,您还会注意到一些奇怪的字符。这是因为这些编码可能不是有效的 unicode/UTF-8 编码。一般来说,大多数地方都使用 UTF-8。在 Protobuf 的情况下,这用于 string,但 ints、maps、Boolean、list 具有单独的格式。此外,此文件还包含数据的元数据。

这就是为什么我们需要一个解码器/反序列化器来读取这些数据。让我们使用它。

cat .\encoded_greeting | protoc --decode=tutorial.Greet .\greeting_cli.proto

greeting: "Yo"
username : "John"
age : 50

因此,正如我们所见,我们能够取回序列化且在文件中看起来很奇怪的数据。