是否可以使用 protoc 从生成的 pb2.py 中获取 proto 文件?gRPC 是否可以进行相同的逆向工程?
问问题
113 次
2 回答
1
文件的格式_pb2.py
因 protobuf-python 版本而异,但其中大多数都有一个名为的字段serialized_pb
。这包含FileDescriptorProto格式的.proto
文件的整个结构:
serialized_pb=b'\n\x0c...'
这可以传递给protoc
编译器以生成其他语言的标头。但是,必须首先将其放入 aFileDescriptorSet
中才能正确匹配格式。这可以使用 Python 完成:
import google.protobuf.descriptor_pb2
fds = google.protobuf.descriptor_pb2.FileDescriptorSet()
fds.file.append(google.protobuf.descriptor_pb2.FileDescriptorProto())
fds.file[0].ParseFromString(b'\n\x0c... serialized_pb data ....')
open('myproto.txt', 'w').write(str(fds))
open('myproto.pb', 'wb').write(fds.SerializeToString())
上面的代码片段保存了一个人类可读的版本 tomyproto.txt
和一种名义上与protoc
to兼容的格式myproto.pb
。文本表示如下所示:
file {
name: "XYZ.proto"
dependency: "dependencyXYZ.proto"
message_type {
name: "MyMessage"
field {
name: "myfield"
number: 1
label: LABEL_OPTIONAL
type: TYPE_INT32
}
...
例如,现在可以使用以下方法生成 C++ 标头:
protoc --cpp_out=. --descriptor_set_in=myproto.pb XYZ.proto
请注意,XYZ.proto
必须与描述符集中的文件名匹配,您可以在myproto.txt
. 但是,如果文件具有依赖项,则此方法很快就会变得困难,因为所有这些依赖项都必须收集在同一个描述符集中。在某些情况下,仅使用文本表示手动重写文件可能更容易.proto
。
于 2021-12-26T13:00:05.600 回答
0
这是可能的,但我不知道有任何工具可以做到这一点。
包括 gRPC 服务定义的协议缓冲区 (protos) 由 protoc 编译为特定于语言的源。您正在寻找反编译器。
我们知道这个过程是可逆的,因为它有效;我们能够使用生成的源(甚至跨语言)向同行发送消息。
于 2021-12-25T16:37:14.840 回答