我可以在protobuf中定义一个常量字符串吗?

29

我使用protobuf的枚举类型在C++应用程序和Java应用程序之间共享值。通过这种方式,相同的(int)值在不同语言之间共享,并且这些值可以在编译时使用。如果我想使用字符串来实现类似的功能,是否可以通过在通用的.proto文件中定义字符串来实现?


我的即兴回答是不。为什么你想要分享一个字符串呢?如果你有两个模块在通信,传输一个枚举常量而不是一个字符串会浪费带宽。 - Emil
2
Protobuf允许枚举类型,这些枚举类型可以传输到网络上,但不一定需要。如果我在我的C++和Java应用程序中使用一个枚举类型(基本上是一个常量),那么我不会在网络上传输任何东西,但它们都使用在.proto中定义的相同值。 - ytoledano
我之前遇到过类似的问题,尝试将字符串与枚举关联起来,这里的答案能帮到你吗?https://dev59.com/Z2bWa4cB1Zd3GeqPTBaV - user812786
1个回答

38

不是真的。

有一些技巧可以使用。但它们都不是很适合,而且(我认为)在proto3中都要消失:

  • 定义一个带有字符串字段的消息,并给它一个默认值,该默认值是您的常量值。但是,据说Protobuf 3正在删除默认值。
  • 使用"自定义选项", 它应该被称为“注释”,因为它们非常像Java或其他语言中的注释。您可以声明一个类型为字符串的注释,然后使用您的注释对某个虚拟声明进行注释并使用常量值。然而,自定义选项基于扩展,而扩展也将在proto3中被删除,所以我认为自定义选项也已被删除。(这是此处提供的答案:https://dev59.com/Z2bWa4cB1Zd3GeqPTBaV#11486640。)

顺便说一下,Cap'n Proto是Protocol Buffers的替代品,支持常量。(披露一下:我是Cap'n Proto的作者,也是Google的大多数Protobuf v2的作者。)


我最终选择了选项1。我定义了一个带有默认值字段的消息,然后使用默认实例来访问它们。这种方法非常简洁,但正如上面所提到的那样,在protobuf 3中不被支持。它有用的原因之一是你可以获得所有protobuf“反射”功能:遍历字段,按编号/名称获取字段... - ytoledano
4
proto3文档中提到:“请注意,创建自定义选项需要使用扩展名,这仅适用于proto3中的自定义选项”。proto3文档链接到@kenton-varda的答案中的proto2文档,以了解自定义选项。 - NYCdotNet
1
那么它被移除了吗? - user1870400
如果您在询问有关扩展的问题,那么是的。但是使用扩展程序制作的自定义选项将保留。因此,扩展程序有例外。 - A. Lisowski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接