【问题标题】:how to serialize/deserialize a protobuf response from google documentai API?如何序列化/反序列化来自 google documentai API 的 protobuf 响应?
【发布时间】:2021-06-15 10:34:50
【问题描述】:

我正在使用谷歌 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 响应。

【问题讨论】:

    标签: python google-cloud-platform protocol-buffers proto


    【解决方案1】:

    我鼓励您阅读 Protocol BuffersPython Tutorial 以更好地了解一切是如何运作的。

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-16
      • 2012-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多