Please enable JavaScript.
Coggle requires JavaScript to display documents.
protol学习 - Coggle Diagram
protol学习
定义消息类型
定义一个消息类型
指定字段类型
除了一般的标量类型外,还可以为字段指定符合类型,比如枚举或者是其他消息类型。
分配字段编号
在一个类型中每个字段类型都有唯一的一个数字,这标识了每个消息类型的编码,如果一旦使用,那么不应该记性更改。注意1-15的字段编号组要一个字节来编码,可以在协议缓冲区编码中找到更多有关此内容的信息,16到2047之间的字段号会占用两个字节,所以我们可以将非常频繁出现的消息元素保留字段编号1到15.记住要要留下一些空间给将来可能添加的频繁元素。
最小的消息类型编码是1,最大的字段编码是2的29次方-1或者是536870911,你不能使用19000到19999之间的数字,因为他们是作为protocol Buffer实例的保留区,如果使用的话,将会让protocol编译出现一些问题,同样,我们也不能使用任何以前保留的字段号。
指定字段规则
required
必须项,在正确格式的消息中这项必须存在
optional
可选项,在格式正确的消息中可以不存在,但是不能超过一个
repeated
重复项,可以在格式正确的消息中重复任意次,也可以零次。重复值的顺序将会被保留。
注意点:
由于历史原因。标量的repeated字段无法有效的编码,新的代码应该使用特殊选项packed=true来获得有效的编码.。
必选项应该永远被小心,如果你希望停止写或者发送一个必需的字段,那么当你想要将字段变成可选字段的时候,旧的读取会推断这个消息没有之前的必选字段到导致这个消息会被无意间拒绝或者丢弃掉,所以可以考虑为缓冲区编写特定于应用程序的自定义验证,不过谷歌的一些工程师认为,选择可选或者重复比必选要更好,更倾向于只使用可选的和重复的。
添加更多的消息类型
多个消息类型可以被定义在一个当杜的.proto文件中,如果你定义多个有联系的消息是,所以,如果你想定义一个消息类型,并将其添加到相同的.proto文件中
合并消息类型会导致过大,当多个消息类型(譬如消息,枚举或者服务)被定义到一个单独的.proto文件中,它会导致依赖性过大,所以建议尽可能少的在每个proto文件中包含消息类型。
添加注释
// 或者 /**/
保留字段
如果我们通过完全删除字段或将其注释掉来更新消息类型,当将来用户在自己对该类型进行更新时可以重用该字段号。如果他们以后加载同一proto的旧版本的时候,可能会导致严重的问题,包括数据损坏,隐式的bug等等,确保这个不会发生的一个方法就是指定你删除的数字或者名字为保留字段,但这个也会导致json序列化的一些问题。将来用户进行编译的时候,编译器也会出现一些问题。
记住,不能在同一保留语句中混用字段名称和字段编号
你的,proto文件编译成了什么?
当使用protocol buffer compiler对一个.proto文件进行编译时,编译器将会编译成你想要的语言。
枚举值
在定义一个消息类型时,你也许想要它的一个字段仅具有一个预定义的值列表中的一个值,比如假设你想要添加一个corpus字段为每个SearchRequest消息,corpus可能是UNIVERSAL,WEB,IMAGES,LOCAL,NEWS,PRODUCTS,orVIDEO,你可以添加一个枚举到你的消息定义中,一个枚举类型的字段只能有一系列常量作为它的值,如果你想提供其他的值,编译器会将其视为未知字段。
可以通过将相同的值分配给不同的枚举常量来定义别名,对此需要将allow_alias选项设置为true,否则编译器将在找到别名时生成错误信息。
枚举常量必须在32位整数范围内,由于枚举值使用variint编码,所以负值,所以不被推荐,你可以在消息定义中使用枚举,在上面的例子中你可以重复使用你定义的枚举类型的值。您还可以使用语法
MessageType
.
EnumType
将一条消息中声明的枚举类型用作另一条消息中的字段类型。
当你在proto文件中使用了enum类型后运行protocol编译器,这生成的代码中将会有相应的java,c++或者关于Ptyhon的EnumDescriptor的字段,可以用来在运行时生成的类中创建一组带有整数值得符号常量
可选字段和默认值
如上,消息描述中的元素可以标记为可选,格式正确的消息可能包含也可能不包含可选元素,则解析对象中的相应字段将会设置为该字段的默认值,可以将默认值作为消息描述的一部分,加入需要为SearchRequest的result_per_page字段进行设置默认值。optional int32 result_per_page = 3 [default = 10];
如果没有给可选元素指定默认值,则使用特定于类型的默认值,对于字符串,默认值是空字符串,对于字节,默认的值是空字节字符串,对于布尔值,默认的值是false,而对于数字类型,默认值为0,对于枚举类型,默认值是在枚举类型定义时第一个被列举的值,这意味着我们在添加一个值到枚举类型列表开头时需要小心,可以看下更新的指导
标量值类型
这个网址指向了proto文件可以自动生成的类中的相应类型
protol是谷歌出品的一类通用文件,使用protol可以将实现前后端文件通信。是一种通用的协议语言,可以实现前后端代码进行相互转义。目前想到的使用场景有前后端通用文件,比如国际化语言,统一字段,还有就是对于接口定义也可以采用这样的方案。统一前后端接口字段。当然这需要前后端在工程上的统一。