我想为我们使用的一些基于protobuf的服务做一些流量调试。
服务都使用已编译的.proto文件来处理消息,我想将消息的实际格式序列化回.proto文件文本并将其发送给客户端,以便客户端不需要知道实现细节在编译时。
这在C ++中是否可行?我知道我可以get the structure of a message without the definition,但是拥有消息字段的名称对于调试至关重要。是否有其他方法可以在没有.proto文件的情况下获取此信息?
谢谢!
答案 0 :(得分:2)
如果原始发件人具有.proto文件,则可以通过“protoc”将它们编译为protobuf数据文件,匹配“descriptor.proto”(应该在您的protobuf分发版中提供) )。您可以使用
执行此操作protoc --descriptor_set_out={out_path} --proto_path={in_path}
(如果你愿意,可以选择stdout,IIRC - 未经测试)
结果二进制数据可以作为bytes
字段包含在内,并且只要客户端还具有从descriptor.proto生成的对象模型,就会进行反序列化。
就反序列化后的操作而言:FileDescriptorSet
是顶级对象;你应该能够遍历到FieldDescriptorProto
,它有会员名等
也许不是很优雅,但它应该有用。
或者,以任意方式包含元数据,并将所有内容视为扩展字段。