C结构(C ++ POD)和谷歌protobufs之间的转换?

我的代码目前传递了很多(有时是嵌套的)C(或C ++ Plain Old Data)结构和数组。

我想将这些转换为谷歌protobufs。 我可以手动编写在这两种格式之间进行转换的代码,但是自动生成此类代码的错误会更少。 做这个的最好方式是什么? (对于有足够内省的语言来迭代成员变量的名称,这很容易,但这是我们所讨论的C ++代码)

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

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

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

如果你决定在python中自己推出,那么gdb的python绑定可能会很有用。 然后,您可以读取符号表,查找在指定文件中定义的所有结构,并迭代所有结构成员。 然后使用.strip_typedefs()获取每个成员的基本类型,并将其转换为适当的protobuf类型。

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

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

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

请注意,这可能会有一些性能影响(因为解析ASCII表示可能很昂贵)。 但是,这样可以省去用其他语言编写转换器的麻烦,因此它似乎是一种方便的解决方案。

我不会自己解析C源代码,而是使用LibClang将C文件解析为AST和我自己的AST walker,以根据需要生成Protobuf和转码器。 谷歌搜索“libclang walk AST”应该给出一些东西,比如来自这个github存储库的 ast-walker.ccast-dumper.cc