一、概述
ProtoBuf(Protocol Buffers),是一种广泛使用的轻量级数据交换格式。相比XML和JSON等其他格式,它具有更高的效率、更小的体积和良好的跨平台支持。本文介绍了ProtoBuf的新版本proto3,包括语法、类型、枚举、消息、服务、扩展等方面。
二、语法
Proto3采用了更加简洁、易读的语法,其中最明显的变化是不再强制要求使用"required"、"optional"和"repeated"等关键字。因为在实践中,这些关键字往往会导致API不兼容、代码难以维护。现在只需要在message中定义需要的字段即可:
syntax = "proto3"; message Book { int32 id = 1; string name = 2; int32 pages = 3; }
同时,还可以在字段名称和序号之间加上"=",使其更加清晰。在上面的例子中,id、name、pages就是该message的三个字段,它们的类型分别是int32、string和int32。类型的定义将在第三部分进行详细介绍。
三、类型
Proto3中定义了以下几种类型:
1.基本类型
int32、int64、uint32、uint64、sint32、sint64、fixed32、fixed64、sfixed32、sfixed64、float、double、bool、string和bytes。
2.枚举类型
枚举类型是一组有名字的整数常量。示例代码如下:
enum Sex { UNKNOWN = 0; MALE = 1; FEMALE = 2; }
3.消息类型
消息类型是可嵌套的类型。在一个message中,可以包含多个类型为int、string、enum、message等的字段。示例代码如下:
message Person { int32 id = 1; string name = 2; int32 age = 3; Sex sex = 4; }
四、消息
消息是ProtoBuf传输的基本单位。每个消息都有一个message类型的名称和一些字段。在编写消息时,可以使用默认值、标记为可选或必需、添加文档等。示例代码如下:
message Book { int32 id = 1 [default = 0]; string name = 2; repeated string author = 3; int32 pages = 4 [deprecated = true]; string brief = 5 [(google.protobuf.uninterpreted_option).string_value = "这是一本书"]; }
上面的例子中,使用了"="和"[]"等符号进行更灵活的定义。其中,"="用于设置默认值,"[]"用于使用标记。另外,还可以使用"(google.protobuf.uninterpreted_option)"进行添加文档等操作。
五、服务
服务定义了一组RPC(Remote Procedure Calls)方法,可以在不同的进程或计算机之间进行调用。服务可以使用message类型定义输入和输出参数,并使用protobuf方法定义服务操作名称、输入参数名称和输出参数名称。示例代码如下:
service Library { rpc GetBook(BookRequest) returns (BookResponse) {} } message BookRequest { int32 id = 1; } message BookResponse { int32 status = 1; Book book = 2; }
六、扩展
Proto3支持扩展机制,允许在不修改原来定义的情况下,添加新的字段。扩展点必须以extend关键字开始,然后是原始的message类型名称,然后是新字段名称、字段类型和字段标记。示例代码如下:
syntax = "proto3"; message Book { int32 id = 1; string name = 2; int32 pages = 3; extensions 100 to 199; } extend Book { int32 size = 101; }
七、总结
Proto3是ProtoBuf的新版本,在语法、类型、枚举、消息、服务、扩展等方面进行了多项改进和优化。它更加简洁、易读、易于扩展,是一种更加高效的数据交换格式。我们可以根据实际需求,灵活选择合适的数据交换格式。