【问题标题】:Conversion between C structs (C++ POD) and google protobufs?C 结构(C++ POD)和谷歌 protobufs 之间的转换?
【发布时间】:2012-10-15 22:50:51
【问题描述】:

我的代码目前传递了很多(有时是嵌套的)C(或 C++ 普通旧数据)结构和数组。

我想将这些转换为/从谷歌 protobufs 转换。我可以手动编写在这两种格式之间转换的代码,但自动生成这样的代码不太容易出错。做这个的最好方式是什么? (这在具有足够内省以迭代成员变量名称的语言中很容易,但这是我们正在谈论的 C++ 代码)

我正在考虑的一件事是编写解析 C 结构然后生成 .proto 文件的 python 代码,以及从成员到成员(在任一方向)复制所有类型的 C 代码,但也许有更好的方法...或者可能已经可以生成另一个 IDL:

  1. .h 文件包含所有嵌套类型
  2. .proto 文件包含等价物
  3. .c 文件,其中包含在 .proto 文件生成的 C++ 结构和 .h 文件中定义的结构之间复制任一方向的函数

【问题讨论】:

  • 我有点迷茫,你是在传递data还是code?如果您传递的只是数据,那么任何序列化库有什么问题?如果您的数据需要用不同的语言读取,我会考虑json 或类似的东西。如果您对共享代码感兴趣,那么这完全是一个不同的问题。 ROS 使用 python 和一些库从消息中生成 C++ 类,我相信还有很多其他框架支持代码生成。你为什么使用 protobuf?

标签: c++ c data-structures protocol-buffers idl


【解决方案1】:

我找不到解决此问题的现成解决方案,如果有,请告诉我!

如果您决定在 python 中自己开发,python bindings for gdb 可能会很有用。然后,您可以读取符号表,查找指定文件中定义的所有结构,并迭代所有结构成员。 然后使用<gdbtype>.strip_typedefs() 获取每个成员的原始类型并将其转换为适当的protobuf类型。

这可能比文本解析器更安全,因为它将处理依赖于架构、编译器标志、预处理器宏等的类型。

我猜想在 protobuf 之间转换的代码也可以从 struct 成员到消息字段的关系生成,但听起来并不容易。

【讨论】:

    【解决方案2】:

    可以通过使用TextFormat 解析ASCII 表示来构建协议缓冲区。因此,一种选择是将方法 dumpAsciiProtoBuf 添加到您的每个结构中。该方法将转储任何简单字段(如字符串、布尔值等)并在嵌套结构字段上递归调用 dumpAsciiProtoBuf。然后,您必须确保连接的结果是有效的 ASCII 协议缓冲区,可以使用 TextFormat 进行解析。

    请注意,这可能会对性能产生一些影响(因为解析 ASCII 表示可能会很昂贵)。但是,这样可以省去用不同语言编写转换器的麻烦,所以这似乎是一个方便的解决方案。

    【讨论】:

    • 感谢您的回复。我不认为 C++ 类可以遍历它自己的成员变量,可以吗?我试图避免维护多段迭代硬编码结构字段的代码。
    【解决方案3】:

    我不会自己解析 C 源代码,而是使用 LibClang 将 C 文件解析为 AST 和我自己的 AST walker 以生成 Protobuf 和必要的转码器。谷歌搜索“libclang walk AST”应该提供一些开始,例如this github repository 中的ast-walker.ccast-dumper.cc

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-10
      • 1970-01-01
      • 1970-01-01
      • 2011-05-19
      • 1970-01-01
      • 2011-03-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多