介绍一下消息的不同类型和引用
您可以使用其他消息类型作为字段类型。例如,假设你想在每个SearchResponse消息中包含Result消息,您可以在同一个.proto中定义一个Result消息类型,然后在SearchResponse中指定一个Result类型的字段:
1 | message SearchResponse { |
在上述示例中,Result消息类型与SearchResponse在相同的文件中定义, 如果要使用的消息类型已经在另一个.proto文件中定义了怎么解决呢?
你可以通过import引入其他的.proto文件:
1 | import "myproject/other_protos.proto"; |
注意
接上边的例子,假如a.proto引入了b.proto,但是b.proto更换了位置,路径变成了test/b.proto(随便举例),我们有两种解决办法:
a.proto中的import语句,直接import "test/b.proto"b.proto文件原来的位置,创建一个b.proto文件,文件内容为import public "test/b.proto",就可以了
import对proto2和proto3都适用
您可以在其他消息类型中定义和使用消息类型,如下,Result消息定义在SearchResponse消息中:
1 | message SearchResponse { |
如果想重复使用Result,可以用Parent.Type的方式使用:
1 | message AnotherResponse { |
修改时要注意的规则:
reserved里Any类型any类型时谷歌protobuf内置的一个类型,通用类型,使用的时候需要导入google/protbuf/any.proto
1 | import "google/protobuf/any.proto"; |
Oneof类型Oneof结构中有多个字段,但是同一时刻只有一个字段生效
1 | message SampleMessage { |
oneof中可以是任意类型,除了repeated 字段
生成代码之后,也会对oneof字段生成getter,setter方法,但是出来的值需要你自己判断一下
如果你要定义一个map,protobuf提供了一个语法:
1 | map<key_type, value_type> map_field = N; |
例如
1 | map<string, Project> projects = 3; |
注意事项
repeated.proto文件生成时,map按key排序你可以添加一个可选标识package到.proto文件中。用来防止命名冲突
1 | package foo.bar; |
在使用这条消息的时候需要加上package名字
1 | message Foo { |
原文:https://www.cnblogs.com/lijianming180/p/12037794.html