开发学院,分享开发教程和最新动态
章节列表 什么是ProtobufProtobuf3 定义数据类型Protobuf3 标量值类型Protobuf3 缺省值Protobuf3 枚举Protobuf3 使用其他消息类型Protobuf3 嵌套类型Protobuf3 更新消息类型Protobuf3 未知字段Protobuf3 Any类型Protobuf3 OneofProtobuf3 MapsProtobuf3 包Protobuf3 定义服务Protobuf3 JSON映射Protobuf3 可选项Protobuf3 生成属于自己的类Protobuf 风格指南Protobuf 编码(1)Protobuf 编码(2)Protobuf 编码(3)Protobuf 技术Protocol Buffer C++实例教程: 为什么使用Protocol Buffer?Protocol Buffer C++实例教程: 定义协议格式Protocol Buffer C++实例教程: 编译Protocol BufferProtocol Buffer C++实例教程: Protocol Buffer APIProtocol Buffer C++实例教程: 发送消息Protocol Buffer C++实例教程: 读取消息Protocol Buffer C++实例教程: 扩展Protocol BufferProtocol Buffer C++实例教程: 优化技巧和高级用法Protocol Buffer C#实例教程: 前言Protocol Buffer C#实例教程:定义协议格式Protocol Buffer C#实例教程:编译Protocol Buffer Protocol Buffer C#实例教程:解析和序列化Protocol Buffer Go实例教程:前言Protocol Buffer Go实例教程:定义协议格式Protocol Buffer Go实例教程:编译Protocol BufferProtocol Buffer Go实例教程:读写消息Protocol Buffer JAVA实例教程:前言Protocol Buffer JAVA实例教程:定义协议格式Protocol Buffer JAVA实例教程:编译Protocol BufferProtocol Buffer JAVA实例教程:Protocol Buffer APIProtocol Buffer JAVA实例教程:写消息Protocol Buffer JAVA实例教程:读消息Protocol Buffer JAVA实例教程:扩展Protocol BufferProtocol Buffer Python实例教程:前言Protocol Buffer Python实例教程:定义消息格式Protocol Buffer Python实例教程:编译Protocol BufferProtocol Buffer Python实例教程:Protocol Buffer APIProtocol Buffer Python实例教程:写消息Protocol Buffer Python实例教程:读取MessageProtocol Buffer Python实例教程:扩展Protocol Buffer

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文件来解析所有类型名称。 每种语言的代码生成器都知道如何引用该语言中的每种类型,即使它有不同的作用域规则。