协议缓冲区,在哪里使用它们?

use*_*754 6 python protocol-buffers

我最近读过一篇关于协议缓冲的文章,

Protocol Buffers是一种序列化结构化数据的方法.它有助于开发程序通过电线相互通信或存储数据.该方法涉及描述某些数据结构的接口描述语言和从该描述生成源代码以生成或解析表示结构化数据的字节流的程序.

我想知道的是,在哪里使用它们?有没有现实生活中的例子而不是简单的地址簿示例?例如,它是否用于预缓存数据库的查询结果?

dim*_*414 5

协议缓冲区是一种数据存储和交换格式,特别用于RPC——程序或计算机之间的通信。

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

协议缓冲区是:

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

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

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

Google 以使用协议缓冲区而闻名,他们所做的几乎所有事情都使用协议缓冲区。如果您可以想象需要存储或传输数据的原因,Google 可能会使用协议缓冲区来实现。