我可以在protobuf中定义一个常量字符串吗? 我使用OptoBuf的枚举来共享C++应用程序和java应用程序之间的值。这样,在不同语言之间共享相同的(int)值,并且这些值在编译时可用。我可以通过在公共.proto文件中定义字符串来对字符串执行类似的操作吗?

我可以在protobuf中定义一个常量字符串吗? 我使用OptoBuf的枚举来共享C++应用程序和java应用程序之间的值。这样,在不同语言之间共享相同的(int)值,并且这些值在编译时可用。我可以通过在公共.proto文件中定义字符串来对字符串执行类似的操作吗?,java,c++,protocol-buffers,Java,C++,Protocol Buffers,不太可能 你可以使用一些技巧。两者都不是很合适,而且(我认为)两者都将在proto3中消失: 使用字符串字段定义消息,并为其指定一个默认值,即常量值。然而,Protobuf3显然正在删除默认值 使用,这可能被称为“注释”,因为它们与Java或其他语言中的注释非常相似。您可以声明string类型的注释,然后用注释注释一些伪声明并使用常量值。但是,自定义选项基于proto3中删除的扩展,因此我假设自定义选项也已删除。(这里给出的答案是:) FWIW是协议缓冲区的替代品,它确实支持常量。(披露:我

不太可能

你可以使用一些技巧。两者都不是很合适,而且(我认为)两者都将在proto3中消失:

  • 使用字符串字段定义消息,并为其指定一个默认值,即常量值。然而,Protobuf3显然正在删除默认值
  • 使用,这可能被称为“注释”,因为它们与Java或其他语言中的注释非常相似。您可以声明string类型的注释,然后用注释注释一些伪声明并使用常量值。但是,自定义选项基于proto3中删除的扩展,因此我假设自定义选项也已删除。(这里给出的答案是:)

FWIW是协议缓冲区的替代品,它确实支持常量。(披露:我是Cap'n Proto的作者,也是谷歌Protobuf v2的大部分作者。)

我的自然回答是否定的。你为什么要共享一个字符串。如果您有两个模块进行通信,那么传输字符串而不是枚举常量将浪费带宽。Protobuf允许枚举,这些枚举可以,但不必通过有线传输。如果我使用的是EnUM,这在我的C++和java应用程序中都是一个常数,我不会通过有线传输任何东西,但是它们都使用了在<代码>中定义的相同值。PROTTO 。我之前有过类似的问题,试图把字符串和枚举联系起来,这里的答案对你有帮助吗?我最终使用了选项1。我用带有默认值的字段定义了一条消息,然后使用默认实例访问它们。它非常干净,但如上所述,Protobuf3不支持它。它有用的一个原因是,您可以获得protobuf的所有“反射”功能:迭代字段,按编号/名称获取字段……proto3的文档说“注意,创建自定义选项使用扩展,这仅允许proto3中的自定义选项使用扩展”。proto3文档链接到@kenton varda答案中定制选项的proto2文档。那么它是否被删除了?@user1870400如果您询问扩展,那么是的。但使用扩展创建的自定义选项被保留。因此,扩展也有例外。