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
因此,正如我们所见,我们能够取回序列化且在文件中看起来很奇怪的数据。