2016-02-29 4121 views
4

我使用protobuf的枚举在C++应用程序和Java应用程序之间共享值。这样,相同的(int)值在语言之间共享,并且这些值在编译时可用。我可以通过不同的方式在共同的.proto文件中定义它,以此类似于字符串吗?我可以在protobuf中定义一个常量字符串吗?

+0

我自发的回答是否定的。为什么你想分享一个字符串。您是否有两个模块进行通信,它将浪费带宽来传输字符串而不是枚举常量。 – Emil

+0

Protobuf允许枚举,那些枚举可以,但不必通过线传输。如果我在C++和Java应用程序中使用基本上是常量的枚举,那么我不会通过线传输任何东西,但它们都使用'.proto'中定义的相同值。 – ytoledano

+0

我在前一段时间尝试将字符串与枚举关联时遇到过类似问题,请问这里的答案对您有帮助吗? http://stackoverflow.com/questions/11474416/define-dictionary-in-protocol-buffer – whrrgarbl

回答

10

不是。

有几个黑客可以使用。两者都不是很适合,并且(我认为)两者都在proto3中消失:

  • 定义带有字符串字段的消息并为其指定一个默认值,该值是您的常量值。但是,Protobuf 3显然正在移除默认值。
  • 使用"custom options",应该可能被称为“注释”,因为它们很像Java或其他语言中的注释。您可以声明一个类型为string的注释,然后用注释注释一些虚拟声明并使用常量值。然而,自定义选项是基于在proto3中删除的扩展,所以我假定自定义选项也被删除了。 (这是这里提供的答案:https://stackoverflow.com/a/11486640/2686899

FWIW,Cap'n Proto,替代协议缓冲区,不支持常量。 (披露:我是Cap'n Proto的作者以及Google的Protobuf v2的大部分作品。)

+0

我结束了使用选项1.我定义了一个消息带有默认值的字段,然后使用默认实例来访问它们。它非常干净,但如上所述,在protobuf 3中不被支持。其中一个有用的原因是您获得了protobuf的所有“反射”功能:遍历字段,按编号/名称获取字段... – ytoledano

相关问题