python - 如何序列化/反序列化来自 google documentai API 的 protobuf 响应?
问题描述
我正在使用谷歌 API 来处理上传的文档。我想要实现的是将响应中的 protobuf 保存为.proto
文件,以便以后可以使用它。
我可以response._pb.SerializeToString()
,但是,我不知道以后如何使用它。我尝试将此结果写入.proto
格式文件,例如:
with open("doc.proto", "wb") as f:
f.write(response._pb.SerializeToString())
但该文件似乎不是一个合适的.proto
文件,我无法通过 protoc 编译器运行它,如下所示:
protoc -I=. --python_out=. ./doc.proto
我收到一堆错误,例如:
doc.proto:7398:6: Invalid control characters encountered in text.
doc.proto:7398:9: Interpreting non ascii codepoint 225.
doc.proto:7398:12: Invalid control characters encountered in text.
doc.proto:7398:15: Need space between number and identifier.
doc.proto:7398:16: Invalid control characters encountered in text.
总而言之,我只是想序列化/反序列化 protobuf API 响应。
解决方案
我鼓励你阅读Protocol Buffers和Python Tutorial以更好地理解一切是如何工作的。
Protobuf(Protocol Buffers)消息以文本格式定义,通常存储在.proto
文件中。这些是要交换的消息的类似于模式的定义。
这些 proto 文件由一种称为protoc
一个或多个编程语言源文件的工具编译。这些源为您的代码提供了一种机制来创建与模式一致的协议缓冲区消息。这些消息以二进制格式发送,这种格式可以有效地跨网络传输,但人类很难理解。
在您的情况下(使用 Python),您需要将收到的响应消息“解组”到protoc
为您生成的 Python 类的对象中。如果您创建了 proto 文件,那么您就有了源文件。如果其他开发人员创建了它们,他们应该能够为您提供 Python 源代码或 proto 文件(您可以从中生成 Python 源代码)。
然后,当您将消息解组为 Python 对象时,您可以存储它们,但您可能更愿意将它们转换为 JSON 并将它们写入文本文件。
总之,您正在接收二进制编码的 protobuf 消息。您需要使用protoc
生成的源对这些进行解码,然后才能对数据做很多有用的事情。
注意,在不知道原型(模式)或没有
protoc
生成(来自原型)源的情况下,将二进制编码的消息直接转换为有用的东西是很有挑战性的。
推荐阅读
- repository - 存储库可以调用清洁架构中的用例吗?
- c# - C#:如何根据一列中的最大值按升序对二维数组中的行进行排序?
- tensorflow2.0 - tf.estimator.BoostedTreesEstimator 在使用涉及 tf.math.abs 的自定义 loss_fn 时返回所有零预测
- r - 中值绝对偏差:在 stat_summary (ggplot2) 中将常数因子设置为 1
- c - C:如何在execv之前通过管道将值从子进程传递到父进程?
- python-3.x - Openpyxl 条件格式化 iconset 条件编号
- ios - UICollectionView 在内存中加载多少?
- python - Python套接字连接在本地网络上不起作用
- java - 我可以创建一个可用于 Android Studio 中所有项目的 java 类吗?
- javascript - “路径”参数必须是字符串类型或 Buffer 或 URL cloudinary 和 nodejs 的实例