首页 > 解决方案 > 如何序列化/反序列化来自 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 响应。

标签: pythongoogle-cloud-platformprotocol-buffersproto

解决方案


我鼓励你阅读Protocol BuffersPython Tutorial以更好地理解一切是如何工作的。

Protobuf(Protocol Buffers)消息以文本格式定义,通常存储在.proto文件中。这些是要交换的消息的类似于模式的定义。

这些 proto 文件由一种称为protoc一个或多个编程语言源文件的工具编译。这些源为您的代码提供了一种机制来创建与模式一致的协议缓冲区消息。这些消息以二进制格式发送,这种格式可以有效地跨网络传输,但人类很难理解。

在您的情况下(使用 Python),您需要将收到的响应消息“解组”到protoc为您生成的 Python 类的对象中。如果您创建了 proto 文件,那么您就有了源文件。如果其他开发人员创建了它们,他们应该能够为您提供 Python 源代码或 proto 文件(您可以从中生成 Python 源代码)。

然后,当您将消息解组为 Python 对象时,您可以存储它们,但您可能更愿意将它们转换为 JSON 并将它们写入文本文件。

总之,您正在接收二进制编码的 protobuf 消息。您需要使用protoc生成的源对这些进行解码,然后才能对数据做很多有用的事情。

注意,在不知道原型(模式)或没有protoc生成(来自原型)源的情况下,将二进制编码的消息直接转换为有用的东西是很有挑战性的。


推荐阅读