定义一个消息类型
message SearchRequst{ //搜素请求消息
required string query = 1; //query字段,string类型,
optional int32 page_number =2;
optional int32 result_per_page = 3;
//optional 可选; required 必须有
}
指定字段类型
所有字段都是标量类型
integers: page_number 和 result_per_page
string:query
还可以指定其他指定符合类型。
枚举类型() 和其他消息类型
指定字段规则
消息字段三种规则:
required:完整的消息内必须拥有此字段。此字段必须拥有(使用双方)
optional:完整的消息内此字段可选,可拥有可以没有(使用双方可选)
repeated:完整的消息内此字段的值可以拥有任意个,重复的值的次数会保存下来
分配指定标签号
每个字段都有一个唯一的数字标签,表示字段在二进制中的位置,使用过程不能更改
标签号范围:
1-15 一个字节标记
16-2047 两个字节标记
最小为1 最大为 2^29 -1 或者536870911 不能使用19000-19999的标签号
.proto文件会生成什么?
序列化到输出流
输入流反序列化
c++编译器会生成对应的.h和.cc文件 每个消息都有独立的操作类
java编译器会生成一个.java文件和一个操作类,此操作类所有消息类型共有,使用一个特有的Builder类为每个消息类型实例化
标量值类型
一个消息的字段如果使用标量可使之为以下类型-这个表格显示了在.proto文件内可以指定的类型与自动生成的相对类型
java的标量值类型: float,int,long,boolean,string ,unicode
optional 字段与其默认值
消息中被optional标识的字段不存在,会被解析为其相对应的字段设置为其字段的默认值
1、字符串:空字符串
2、bool:false
3、数字类型:0
4、枚举类型:第一个枚举类型
枚举值
message SearchRequst{ //搜素请求消息
required string query = 1; //query字段,string类型,
optional int32 page_number =2;
optional int32 result_per_page = 3 [default = 10];
enum Corpus{
UNIVERSAL = 0;
WEB = 1;
IMAGES =2 ;
LOCAL = 3;
PRODUCTS = 4;
VIDEO = 5;
}
optional Corpus corpus = 4 [default = UNIVERSAL];//指定枚举类型与其可能的值
//optional 可选; required 必须有
}