您的位置:

Proto3:新版ProtoBuf协议介绍

一、概述

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的新版本,在语法、类型、枚举、消息、服务、扩展等方面进行了多项改进和优化。它更加简洁、易读、易于扩展,是一种更加高效的数据交换格式。我们可以根据实际需求,灵活选择合适的数据交换格式。