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