【问题标题】:Plain struct from protocol buffer message来自协议缓冲区消息的普通结构
【发布时间】:2020-10-27 16:33:23
【问题描述】:

有没有办法从 C++ 中的协议缓冲区消息中获取一个简单的结构? 即

struct PlainFoo {
  int32_t bar;
  float baz;
};

来自

message Foo {
  required int32 bar = 1;
  required float baz = 2;
}

我通过网络在协议缓冲区中获取了一些数据,我希望能够将其添加到其他类似的数据中,并将其存储在紧凑的表示中以供内部使用,而无需在我的代码中基本上复制消息声明。

我知道我可以使用生成的消息类本身,但它有一堆内部成员,我不想到处移动。

相关消息只有必填字段。

【问题讨论】:

  • My 在 C++ 中的 Protobuf 规范的实现与您想要的类似(除了所有 Protobuf struct 都派生自一个公共类)。但我无法与您分享该实现,因为它基于我公司专有的 C++ 框架。

标签: c++ protocol-buffers


【解决方案1】:

我不知道会生成普通结构的 C++ protobuf 库,但也有可以在 C++ 代码中使用的 C 库。至少nanopbpbtools 生成简单的结构体:

/*纳米pb */ typedef 结构 _Foo { int32_t 条形图; 浮动 baz; } 富; /* pbtools */ 结构 Foo_t { int32_t 条形图; 浮动 baz; };

使用 nanopb,您还可以选择使用 PB_BIND() 将标签号定义从 .proto 文件连接到在您自己的代码中定义的结构。如果您想将代码与接口规范分离,这将很有用,并允许例如添加未序列化的额外字段。

【讨论】:

  • 但最后一个只是 typedef。它不能容纳任何东西
  • @АлексейНеудачин 我不明白你的评论,你能详细说明一下吗?
  • 你在第一种情况下有变量
  • @АлексейНеудачин 不,在这两种情况下都没有变量。它们都是类型声明,在 C 和 C++ 中都有效。在 C++ 中,typedef 是多余的但有效。在 C 中,它允许在引用类型时省略 struct
猜你喜欢
  • 1970-01-01
  • 2013-09-01
  • 1970-01-01
  • 2019-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多