我想为我们使用的一些基于 protobuf 的服务对流量进行一些消息调试。
这些服务都使用编译的 .proto 文件作为消息,我想将消息的实际格式序列化回 .proto 文件文本并将其发送到客户端,以便客户端在编译时不需要知道实现细节。
这在C++可能吗?我知道我可以在没有定义的情况下获取消息的结构,但是拥有消息字段的名称对于调试至关重要。有没有另一种方法可以在没有 .proto 文件的情况下获取此信息?
谢谢!
如果原始发送者有 .proto 文件,则可以通过 "protoc" 将它们编译成 protobuf 数据文件,匹配 "descriptor.proto" (应该在您的 protobuf 发行版中可用)。您可以通过使用
protoc --descriptor_set_out={out_path} --proto_path={in_path}
(如果您愿意,也可以使用 stdout,IIRC - 未经测试)
生成的二进制数据可以作为bytes
字段包含在内,只要客户端还具有从 descriptor.proto 生成的对象模型,就可以进行反序列化。
关于反序列化后该怎么做:FileDescriptorSet
是顶级对象;你应该能够向下遍历到 FieldDescriptorProto
,它有成员名等
也许不是很优雅,但它应该可以工作。
或者,以任何方式包含元数据,并将所有内容视为扩展字段。