python - Protocol buffers,在哪里使用它们?

标签 python protocol-buffers

我最近读了一篇关于 protocol buffers 的文章,

Protocol Buffers is a method of serializing structured data. It is useful in developing programs to communicate with each other over a wire or for storing data. The method involves an interface description language that describes the structure of some data and a program that generates source code from that description for generating or parsing a stream of bytes that represents the structured data

我想知道的是,在哪里使用它们?除了简单的地址簿示例之外,还有现实生活中的示例吗?例如,它是否用于预先缓存数据库的查询结果?

最佳答案

Protocol Buffer 是一种数据存储和交换格式,特别用于 RPC - 程序或计算机之间的通信。

替代方案包括特定于语言的序列化(Java 序列化、Python pickles 等)、表格格式(如 CSV 和 TSV)、结构化文本格式(如 XML 和 JSON)以及其他二进制格式(如 Apache Thrift ) 。从概念上讲,这些只是表示结构化数据的不同方式,但实际上它们各有优缺点。

Protocol Buffer 是:

  • 节省空间,依靠 custom format紧凑地表示数据。
  • 提供强类型安全跨语言(特别是在 Java 等强类型语言中,但即使在 Python 中它仍然非常有用)。
  • 设计为向后和向前兼容。对 Protocol Buffer 进行结构更改(通常添加新字段或弃用旧字段)很容易,而无需确保使用原型(prototype)的所有应用程序同时更新。
  • 手动操作有点乏味。虽然有文本格式,但它主要用于手动检查而不是存储原型(prototype)。例如,JSON 对于人类来说更容易编写和编辑。因此原型(prototype)通常由程序编写和读取。
  • 依赖于 .proto 编译器。通过将结构与数据 Protocol Buffer 分离可以变得精简而简单,但这意味着不需要关联的 .proto 文件和像 protoc 之类的工具来生成解析它的代码, proto 格式的任意数据是不可用的。这使得 proto 成为向其他可能没有 .proto 文件的人发送数据的糟糕选择。

对不同格式进行一些全面的概括:

  • CSV/TSV/等。对于不需要在人或程序之间传输的人工构建的数据很有用。它很容易构造并且易于解析,但保持同步是一场噩梦,并且无法轻松表示复杂的结构。
  • 特定于语言的序列化(例如 pickles)对于短期序列化很有用,但很快就会遇到向后兼容性问题,并且显然会限制您只能使用一种语言。除了在某些非常特殊的情况下,protobuf 可以实现所有相同的目标,并且具有更高的安全性和更好的面向 future 的能力。
  • JSON 非常适合在不同方之间发送数据(例如公共(public) API)。因为结构和内容一起传输,任何人都可以理解它,并且很容易用所有主要语言进行解析。现在几乎没有理由使用 XML 等其他结构化格式。
  • Protocol Buffer 等二进制格式非常适合几乎所有其他数据序列化用例;长期和短期存储、进程间通信、进程内和应用程序范围的缓存等等。

Google 著名 uses protocol buffers for practically everything they do 。如果您能想象出需要存储或传输数据的原因,Google 可能会使用 Protocol Buffer 来实现。

关于python - Protocol buffers,在哪里使用它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34368014/

相关文章:

python - kivy 相当于 Tkinter after()

Python Selenium Webdriver - 在指定的一个之后抓取 div

c++ - ProtocolBuffer,SerializeToArray() 上的 abort()

python - 即使在清除方法覆盖之后,表单字段仍然会错误地验证

python - 有没有python源代码的类图生成工具?

python - 如何通过对第 3 列中的值求和来将前 2 列中具有相同值的 Pandas Dataframe 行组合在一起?

java - Google Protocol Buffer 和 UTF-16

go - 如何获取 golang proto 生成的复杂结构中的所有字段名称

c# - Protobuf-net 与 C++ 的官方谷歌 Protobuf 不兼容(消息编码)

java - gRPC + Bazel + Envoy Json Proxy - 如何导入 google/api/annotations.proto