开发学院

您的位置:首页>教程>正文

教程正文

Protobuf3 包

Protobuf3 包

  您可以向 .proto 文件中添加可选的包名称,以防止协议消息类型之间的名称冲突。

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

  然后,您可以在定义消息类型的字段时使用包名:

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

  包名影响生成代码的方式取决于您选择的语言:

  在c++中,生成的类被包装在c++命名空间中。例如,Open将位于命名空间foo : : bar中。

  在Java中,包用作Java包,除非您在.proto文件中声明一个选项java_package。

  在Python中,包指令被忽略,因为Python模块是根据它们在文件系统中的位置来组织的。

  在Go中,包用作Go包名称,除非在.proto文件中显式提供选项go_package。

  在Ruby中,生成的类被包装在嵌套的Ruby命名空间中,转换为所需的Ruby大写风格(首字母大写;如果第一个字符不是字母,则前置PB_ )。例如,Open将位于命名空间Foo : : Bar中。

  在c#中,包在转换为PascalCase后用作命名空间,除非在.proto文件显式提供了选项csharp_namespace。例如,Open将位于命名空间Foo.Bar中

包和名称解决方案

   协议缓冲区语言中的类型名称解析类似c++ :首先搜索最里面的范围,然后搜索最里面的上一级,依此类推,每个包都被认为是其父包的“内部”。"."开头(例如 .foo.bar.Baz)意味着从最外面的范围开始。

  协议缓冲区编译器通过解析导入的.proto文件来解析所有类型名称。 每种语言的代码生成器都知道如何引用该语言中的每种类型,即使它有不同的作用域规则。