首先让咱们来看一个很是简单的例子。 假设你想定义一个消息格式,用来表示搜索请求,其中每一个搜索请求都有三项:javascript
下边是用来定义消息类型的.proto
文件java
syntax = "proto3";
message SearchRequest {
string query = 1;
int32 page_number = 2;
int32 result_per_page = 3;
}复制代码
protobuf
会认为你使用的是protobuf2
,并且,这行必须是第一行,前边也不能有注释SearchRequest
这条消息定义了三个字段(名称/值对),每条消息都要包含这三个字段,每一个字段都有一个名称和一个类型在上面的例子中,全部字段都是基本类型:两个整数(page_number和result_per_page)和一个字符串(query)。这些字段也能够是复合类型,包括枚举和其余消息类型ui
消息定义中的每一个字段都有惟一的编号标签,这些标记用于以消息二进制格式标识字段,消息开始使用以后就不能修改编码
注意:spa
所以,你应该为很是频繁出现的消息元素保留标签1到15。记住要为可能在未来添加的频繁出现的元素留出一些空间。code
最小的标签是1,最大的标签是536870911
,即2^29 - 1
,而且19000 - 19999
为protobuf
系统保留标签,不能使用这几个接口
一共有两种类型ip
proto3
中,基本类型的重复字段默认压缩编码能够在单个.proto
文件中添加多个消息类型,例如字符串
message SearchRequest {
string query = 1;
int32 page_number = 2;
int32 result_per_page = 3;
}
message SearchResponse {
...
}复制代码
可使用//
为.proto
文件添加注释。例如编译器
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.
}复制代码
当消息类型更新或者删除时,这些被修改的字段的标签若是继续使用,会形成数据不正确的问题,这时须要把这些标签保留起来,防止跟旧版本的数据发生冲突。
(当使用JSON序列化时,字段名称也有可能存在这个问题),通俗来讲,就至关于已经上线了使用A接口的一个APP,这个时候服务端若是想修改A接口的数据格式,只能新增一个接口,而且确定不能使用A接口的地址
案例
message Foo {
reserved 2, 15, 9 to 11;
reserved "foo", "bar";
}复制代码
这就表示 2,15,9,10,11,"foo", "bar"都不能重复使用了
.proto
文件会生成什么?当编译.proto
文件时,编译器将根据你选择的语言生成对应代码,你须要使用文件中描述的消息类型,包括获取和设置字段值,将消息序列化 输出流,以及解析来自输入流的消息
.proto
生成.h
和.cc
文件,并为您的文件中描述的每一个消息类型指定一个类.java
文件,以及用于建立消息类实例的特殊Builder类.proto
中每一个消息类型的静态描述符,而后使用元类在运行时建立必要的Python数据访问类.proto
生成一个pbobjc.h
和pbobjc.m
文件,在文件中描述的每一个消息类型都有一个类.proto
生成一个.cs
文件,在文件中描述的每一个消息类型都有一个类