1

我想为我们使用的一些基于 protobuf 的服务对流量进行一些消息调试。

这些服务都使用已编译的 .proto 文件作为消息,我想将消息的实际格式序列化回 .proto 文件文本并将其发送给客户端,以便客户端在编译时不需要知道实现细节.

这在 C++ 中可能吗?我知道我可以在没有定义的情况下获得消息的结构,但是拥有消息字段的名称对于调试至关重要。在没有 .proto 文件的情况下,是否有另一种获取此信息的方法?

谢谢!

4

1 回答 1

2

如果原始发送者有 .proto 文件,它们可以通过“protoc”编译成 protobuf 数据文件,匹配“descriptor.proto”(应该在您的 protobuf 分发中可用)。您可以使用

protoc --descriptor_set_out={out_path} --proto_path={in_path}

(或者如果您愿意,可以使用标准输出,IIRC - 未经测试)

生成的二进制数据可以作为一个bytes字段包含在内,并且只要客户端还具有从 descriptor.proto 生成的对象模型,就可以单独反序列化。

反序列化后要做什么:FileDescriptorSet是顶级对象;您应该能够向下遍历到FieldDescriptorProto,其中包含成员名称等

也许不是很优雅,但它应该可以工作。

或者,以任何方式包含元数据,并将所有内容视为扩展字段。

于 2012-06-27T21:17:08.033 回答