开发学院,分享开发教程和最新动态
章节列表 什么是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文件中可以声明许多选项。选项不会改变声明的整体含义,但可能会影响在特定上下文中处理声明的方式。可用选项的完整列表在google/protobuf/descriptor.proto中定义

  有些选项是文件级选项,这意味着它们应该写在顶级范围内,而不是任何消息、枚举或服务定义内。有些选项是消息级选项,这意味着它们应该写在消息定义中。有些选项是字段级选项,这意味着它们应该写在字段定义中。选项也可以写在枚举类型、枚举值、服务类型和服务方法上;然而,目前没有任何有用的选择。

  以下是一些最常用的选项:

  java_package (file option): 用于生成的Java类的包。如果.proto文件中没有给出明确的Java _ package选项,那么默认情况下将使用proto package (在.proto文件中使用“package”关键字指定)。然而,proto包通常不能成为好的Java包,因为proto包不应该以反向域名开始。如果不生成Java代码,则此选项无效。

  option java_package = "com.example.foo";

  java_multiple_files (file option):  导致顶层消息、枚举和服务在包级别定义,而不是在以.proto文件命名的外部类中定义。

  option java_multiple_files = true;

  java_outer_classname (file option): 要生成的最外面的Java类的类名(因此也是文件名)。如果.proto文件中未指定显式 java_outer_classname,则类名将通过转换来构造。原型文件名转换为ccamel-case(因此foo_bar.proto变成了FooBar.java)。如果不生成Java代码,则此选项无效。

  option java_outer_classname = "Ponycopter";

  optimize_for (file option): 可以设置为SPEED、CODE_SIZE或LITE_RUNTIME。这会以以下方式影响c++和Java代码生成器(以及可能的第三方生成器) :

  SPEED (default): 协议缓冲区编译器将生成用于序列化、解析和对消息类型执行其他常见操作的代码。这个代码是高度优化的。

  CODE_SIZE: 协议缓冲编译器将生成最少的类,并将依赖共享的、基于反射的代码来实现序列化、解析和各种其他操作。因此,生成的代码将比速度小得多,但是操作将会更慢。类仍将实现与它们在速度模式下完全相同的公共API。这种模式在包含大量.proto文件的应用程序中非常有用,并且不需要所有这些文件都非常快。

  LITE_RUNTIME: 协议缓冲编译器将生成仅依赖于“lite”运行时库( ibprotobuf-lite而不是libprotobuf )的类。lite运行时比整个库小得多(大约小一个数量级),但省略了某些功能,如描述符和反射。这对在手机等受限平台上运行的应用程序特别有用。编译器仍然会生成所有方法的快速实现,就像在速度模式下一样。生成的类将只实现每种语言的MessageLite接口,它只提供完整消息接口方法的子集。

  option optimize_for = CODE_SIZE;

  cc_enable_arenas (file option): 为c++生成的代码启用竞技场分配。

  objc_class_prefix (file option): 设置Objective-C类前缀,该前缀加在所有Objective-C生成的类和该. proto中的枚举之前。没有默认值。按照Apple的建议,您应该使用3 - 5个大写字符之间的前缀。请注意,Apple保留了所有2个字母前缀。

  deprecated (field option): 如果设置为true,则表示该字段已过时,不应由新代码使用。在大多数语言中,这没有实际效果。在Java中,这变成了一个@Deprecated annotation的注释。将来,其他语言特定的代码生成器可能会在该字段的访问者上生成折旧注释,这反过来会在编译试图使用该字段的代码时发出警告。如果该字段未被任何人使用,并且您希望阻止新用户使用它,请考虑用保留语句替换字段声明。

  int32 old_field = 6 [deprecated=true];

自定义选项

  协议缓冲区还允许您定义和使用自己的选项,这是大多数人不需要的高级功能,如果你确实认为你需要创建自己的选项,请参见proto 2语言指南了解详细信息。请注意,创建自定义选项使用扩展,这仅允许用于proto 3中的自定义选项。