【gRPC】第3篇 一篇文章带你了解使用 Protocol Buffers(protobuf)

目录

1、Protocol Buffers介绍

2、跨语言兼容性

 3、Protocol Buffers 如何工作

 4、语法示例

枚举

5、分配字段编号


1、Protocol Buffers介绍

Protocol Buffers 是一种与语言无关、与平台无关的可扩展机制,用于序列化结构化数据。

Google 的语言中立、平台中立、可扩展的 序列化结构化数据的机制 – 想想 XML,但更小、更快、 简单。您只需定义一次数据的结构,然后就可以 使用特殊生成的源代码轻松编写和读取结构化数据 往返各种数据流并使用多种语言。

要安装 protobuf,你需要安装协议编译器(用于编译.proto 文件)和所选编程语言的 Protobuf 运行时。

下面显示了一个示例 message:

message Person {
  optional string name = 1;
  optional int32 id = 2;
  optional string email = 3;
}

优点包括:

  • 紧凑的数据存储
  • 快速解析
  • 支持多种编程语言
  • 通过自动生成的类优化功能

2、跨语言兼容性

编译器直接支持以下语言, 协议:

Google 支持以下语言,但项目的源代码 驻留在 GitHub 存储库中。

protoc 编译器使用插件来实现这些 语言:

 3、Protocol Buffers 如何工作

 4、语法示例

proto3是新版本的protobuf语法。它简化了部分语法,并扩大了支持的语言,Ruby、C#。目前谷歌推荐只在是用新支持的语言或使用新的gRPC框架的时候使用。

proto2和proto3不是完全兼容的。这里列出一些proto2与proto3的区别。

希望编译器使用proto3进行编译需要在文件对行加上:

syntax = "proto3";
syntax = "proto3";
 
message Person {
  string name = 1;
  int32 age = 2;
  repeated string loction = 3;
}

可以看到相比于proto2语法这里没有前面的required/optional,在proto3中所有字段都是可选的,同时取消了自定义默认值,默认值为0或空。

枚举

与proto2不同proto3的枚举值第一个值得tag必须为0,同时枚举值的默认值将默认使用第一个值,这样就和其他类型都保持了统一,即默认值为0。

enum Location {
   SHANGHAI = 0;
   BEIJING = 1;
   GUANGZHOU = 2;
 }

同时proto2的枚举类型不能被proto3直接import,但是间接引用不受影响。

5、分配字段编号

正如你所见,消息中定义的每个字段都有一个唯一编号。字段编号用于在消息二进制格式中标识字段,同时要求消息一旦使用字段编号就不应该改变。注意一点 1 到 15 的字段编号需要用 1 个字节来编码,编码同时包括字段编号和字段类型。

16 到 2047 的字段变化使用 2 个字节。因此应将 1 到 15 的编号用在消息的常用字段上。注意应该为将来可能添加的常用字段预留字段编号。

最小的字段编号为 1,最大的为 2^29 - 1,或 536,870,911。注意不能使用 19000 到 19999 (FieldDescriptor::kFirstReservedNumberFieldDescriptor::kLastReservedNumber)的字段编号,因为是 protocol buffer 内部保留的——若在 .proto 文件中使用了这些预留的编号 protocol buffer 编译器会发出警告。同样也不能使用之前预留的字段编号。

Overview | Protocol Buffers DocumentationProtocol Buffers are a language-neutral, platform-neutral extensible mechanism for serializing structured data.https://protobuf.dev/overview/

猜你喜欢

转载自blog.csdn.net/fanjufei123456/article/details/130025070