包及名称的解析

为了防止不同的消息类型有命名冲突我们也可以为.proto文件新增一个可选的package声明符。如

  1. package config;
  2. message Open { ... }

在其他的消息格式定义中也可以使用包名+消息名的方式来定义域的类型,如:

  1. message Foo {
  2. ...
  3. required foo.bar.Open open = 1;
  4. ...
  5. }

包的声明符会根据使用语言的不同影响生成的代码:

  • 对于C++,产生的类会被包装在C++的命名空间中,如上例中的Open会被封装在 foo::bar空间中; - 对于Java,包声明符会变为java的一个包,除非在.proto文件中提供了一个明确有java_package;
  • 对于 Python,这个包声明符是被忽略的,因为Python模块是按照其在文件系统中的位置进行组织的。
  • 对于Go,包可以被用做Go包名称,除非你显式的提供一个option go_package在你的.proto文件中。
  • 对于Ruby,生成的类可以被包装在内置的Ruby名称空间中,转换成Ruby所需的大小写样式 (首字母大写;如果第一个符号不是一个字母,则使用PB_前缀),例如Open会在Foo::Bar名称空间中。
  • 对于javaNano包会使用Java包,除非你在你的文件中显式的提供一个option java_package。
  • 对于C#包可以转换为PascalCase后作为名称空间,除非你在你的文件中显式的提供一个option csharp_namespace,例如,Open会在Foo.Bar名称空间中.

Protocol buffer语言中类型名称的解析:首先从最内部开始查找,依次向外进行,每个包会被看作是其父类包的内部类。

ProtocolBuffer编译器会解析.proto文件中定义的所有类型名。 对于不同语言的代码生成器会知道如何来指向每个具体的类型,即使它们使用了不同的规则。