Protocol Buffers - 命令行使用



概述

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

如果我们查看此文件内部的内容或cat此文件 -

cat .\encoded_greeting

☻Yo↕♦John↑2

您会注意到除了“Yo”“John”之外的一些奇怪字符。这是因为这些编码可能不是有效的 Unicode/UTF-8 编码。一般来说,UTF-8 是大多数地方使用的东西。在 Protobuf 的情况下,这用于字符串,但整数、映射、布尔值、列表具有单独的格式。此外,此文件还包含数据的元数据。

因此,我们需要一个解码器/反序列化器来读取此数据。让我们使用它。

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

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

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

广告