Protocol Buffers

本文介绍了Google开发的ProtocolBuffers(Protobuf),一种高效的数据结构序列化方式,比XML和JSON更小、更快。Protobuf支持多种语言,如Java、Python等,通过定义数据结构,可以轻松实现数据的读写。文章还详细讲解了.proto文件的语法,包括消息类型定义、字段编号、嵌套类型和服务定义。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

介绍

Protocol Buffers简称Protobuf,是Google公司开发一种跨语言和平台的序列化数据结构的方式。与XMLJSON格式相比,protobuf更小、更快和更便捷。你可以定义数据的结构化结构,然后使用各种语言的源代码轻松的将结构化数据写入和读取。Protocol Buffers目前支持生成Javapythonobective-cC++的代码,新的proto3版本支持DartGoRubyC#以及更多语言。

安装

protocolbuffers/protobuf下载需要的版本,下载解压后。需要设置环境变量。假设你解压到protobuf目录下,那么需要将protobuf/bin目录添加到path环境变量中。然后在命令行输入protoc --version,如果出现版本信息,说明安装成功。

使用

添加注释

使用C/C++风格的注释,///* ... */

/* SearchRequest represents a search query, with pagination options to
 * indicate which results to include in the response. */

message SearchRequest {
    string  query   = 1;
    int32   page_number = 2; //which page number do we want?
    int32   result_per_page = 3; //number of results to return per page.
}
定义一个消息类型

来看一个简单的例子。假设你想要定义一个搜索请求的消息,其中每个搜索请求都有一个查询字符串以及你感兴趣的特定页面以及每页的结果。下面就是定义消息类型的.proto文件。

syntax  = "proto3"

message SearchRequest {
    string  query   = 1;
    int32   page_number= 2;
    int32   result_per_page = 3;
}

文件的第一行是文件的第一个非空、非注释行,用来定义我们使用proto3语法,如果你不这样做,protocol buffers会认为你使用的是proto2.
SearchRequest消息定义三个字段,每个字段对应包含在此类消息中的每个数据。每个字段都有一个名称和类型。上面的例子中,所有字段都是标量类型。两个整数(page_numberresult_per_page)和一个字符串(query)。但是你可以为字段指定复合类型,包括枚举和其他消息类型。

添加多个消息类型

一个.proto文件中可以定义多个消息类型。当你定义多个相关消息,这非常有用。例如,如果你要定义与SearchResponse消息类型对应的回复消息格式,可以将其添加到相同的.proto文件中。

message SearchRequest {
    string  query   = 1;
    int32   page_number = 2;
    int32   result_per_page = 3;
}

message SearchResponse {
    ...
}
指定字段数字

从上面的例子中可以看到,消息定义中每个字段都有一个唯一的编号。这些编号用于在消息二进制格式中标识字段,并且在使用消息后不应在更改。1~15范围内的字段编号需要一个字节进行编码,包括字段编号和字段类型。16~2047范围内的字段编号需要占用两个字节,因此,你应该为频繁出现的消息元素保留字段编号1~15。最小的字段编号是1,最大字段编号数是2^29-1(536870911)。但是不能使用19000~19999编号,因为它们是protocol buffers保留的。

使用其他消息类型

你可以使用其他消息类型作为字段类型,例如,之前的SearchResponse消息想包含Result消息。那么你可以在同一个.proto文件中定义Result消息,然后使用Result作为SearchResponse的字段类型。

message SearchResponse {
    repeated    Result  results = 1;
}

message Result {
    string  url = 1;
    string  title   = 2;
    repeated    string snippets = 3;
}

上面的例子中,Result消息类型是和SearchResponse定义在同一个文件中。那么如果你想使用其他文件中已经定义好的字段类型,你可以通过导入语句来定义。例如import "myproject/other_protos.proto";

嵌套类型

你可以在消息类型里面嵌套消息类型,例如下面在SearchResponse消息中嵌套Result消息。

message SearchResponse {
    message Result {
        string url = 1;
        string title = 2;
        repeated string snippets = 3;
    }
    repeated Result results = 1;
}

如果你想在非父消息中使用子消息,就需要按Parent.Type结构来使用。

message SomeOtherMessage {
    SearchResponse.Result result = 1;
}

你可以添加可选的包说明添加到.proto文件中,以防止protocol消息类型之间的名称冲突。

package foo.bar;
message Open { ... }

然后你可以在定义消息类型的字段时,使用包说明符。

message Foo {
    ...
    foo.bar.Open open = 1;
}

包说明符影响生成的代码的方式取决于你选择的语言。在Go中,除非在.proto文件中明确提供选项go_package,否则该包将用作Go包名称。

定义服务

如果你需要在RPC系统中使用消息类型,那么你可以在.proto文件中定义RPC服务接口。protocol buffer编译器会生成服务接口代码,例如,你想定义RPC服务,它有两个方法:SearchRequestSearchResponse。那么你可以在.proto文件中做如下定义:

service SearchService {
    rpc Search (SearchRequest) returns (SearchResponse);
}

protocol buffer一起使用的最简单的RPC系统是gRPCgRPC特别适用于protocol buffer,并允许你使用特定的protocol buffer编译插件直接从.proto文件生成相关的RPC代码。

参考文章

  1. Developer Guide
来源:https://github.com/google/protobuf/releases protocolbuffer(以下简称PB)是google 的一种数据交换的格式,它独立于语言,独立于平台。google 提供了多种语言的实现,如:java、c#、c++、javascript、go 、python、ruby和php等,每一种实现都包含了相应语言的编译器以及库文件。由于它是一种二进制的格式,比使用 xml 进行数据交换快许多。可以把它用于分布式应用之间的数据通信或者异构环境下的数据交换。作为一种效率和兼容性都很优秀的二进制数据传输格式,可以用于诸如网络传输、配置文件、数据存储等诸多领域。 本资源包含: protobuf-all-3.6.0.tar.gz 8.25 MB protobuf-all-3.6.0.zip 4.25 MB protobuf-cpp-3.6.0.tar.gz 5.18 MB protobuf-cpp-3.6.0.zip 4.57 MB protobuf-csharp-3.6.0.tar.gz 5.66 MB protobuf-csharp-3.6.0.zip 4.7 MB protobuf-java-3.6.0.tar.gz 5.86 MB protobuf-java-3.6.0.zip 4.4 MB protobuf-js-3.6.0.tar.gz 5.43 MB protobuf-js-3.6.0.zip 4.59 MB protobuf-objectivec-3.6.0.tar.gz 5.69 MB protobuf-objectivec-3.6.0.zip 4.6 MB protobuf-php-3.6.0.tar.gz 5.64 MB protobuf-php-3.6.0.zip 4.53 MB protobuf-python-3.6.0.tar.gz 5.57 MB protobuf-python-3.6.0.zip 4.52 MB protobuf-ruby-3.6.0.tar.gz 5.5 MB protobuf-ruby-3.6.0.zip 1.46 MB protoc-3.6.0-linux-aarch_64.zip 1.31 MB protoc-3.6.0-linux-x86_32.zip 1.36 MB protoc-3.6.0-linux-x86_64.zip 2.44 MB protoc-3.6.0-osx-x86_32.zip 2.39 MB protoc-3.6.0-osx-x86_64.zip 984 KB protoc-3.6.0-win32.zip Source code (zip) Source code (tar.gz)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值