如何使用C++读取Protobuf oneof消息?

问题描述 投票:0回答:1

考虑这样一个简单的 Protobuf 代码:

message MessageName
{
  oneof some_options {
    OptionA optionAName = 1;
    OptionB optionBName = 2;
  }
}

这将生成以下 C++ 代码(或类似的代码,我手动重命名了一些变量,因此它可能不是 100% 正确):

typedef struct _namespace_name_MessageName {
    pb_size_t which_some_options;
    union {
        namespace_name_OptionA optionAName;
        namespace_name_OptionB optionBName;
    } some_options;
} namespace_name_MessageName;

如何在C++中读取此消息?我想说“如果是选项A,则执行此操作”和“如果是选项B,则执行此操作”。我还没能弄清楚

which_some_options
是如何工作的,我根本无法在文档中找到它。我确实读过 this 但我找不到 Protobuf 生成的代码中提到的任何方法。一个展示我应该如何完成我想要完成的事情的例子将不胜感激。

c++ protocol-buffers
1个回答
0
投票

我的项目也遇到同样的问题。

我的解决方案工作正常。

我正在使用proto3。

struct OptionA 
{
  int x1;
  int x2;
  string x3;
};

struct OptionB 
{
  int y1;
  int y2;
  string y3;
};

发送方:

message MessageName
{
  enum option_type {TYPE_A, TYPE_B}

  oneof some_options {
      OptionA optionAName = 1;
      OptionB optionBName = 2;
  }
}

接收方:

if MessageName.option_type == TYPE_A
    OptionA *ptrA = MessageName.optionAName()

if MessageName.option_type == TYPE_B
    OptionB *ptrB = MessageName.optionBName()
© www.soinside.com 2019 - 2024. All rights reserved.