协议缓冲区,何时使用它们?

7

我最近阅读了一篇关于协议缓冲区的文章。

协议缓冲区是一种序列化结构化数据的方法。它在开发程序用于通过网络进行通信或存储数据时非常有用。该方法涉及一个接口描述语言,描述一些数据的结构以及从该描述生成源代码的程序,用于生成或解析表示结构化数据的字节流。

我想知道的是,在哪里可以使用它们? 除了简单的地址簿示例之外,是否有实际的使用案例?例如,它是否用于预缓存数据库的查询结果?


官方文档可能比某个仅限于Python的分支更适合作为起点。请参阅官方文档 - dimo414
1
Cherenkov望远镜阵列很可能会使用ProtoBufs覆盖ZMQ来发送望远镜数据:http://arxiv.org/pdf/1508.06473v1.pdf - MaxNoe
OpenStreetMap从XML转换为Protocol Buffers是为了减小文件大小并提高解析速度:http://wiki.openstreetmap.org/wiki/PBF_Format - jpa
2个回答

6

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

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

Protocol Buffers 的特点包括:

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

对于不同格式,可以做出一些概括性的描述:

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

谷歌以协议缓冲区 几乎涵盖了他们所做的一切。如果您能想象需要存储或传输数据的原因,谷歌可能会使用协议缓冲区。


4
我使用它们创建了一个金融交易系统,原因如下:
  • 有多种语言的库可供选择。有些功能需要用C++实现,而有些则需要用C#,并且可以扩展到Python或Java等其他语言。
  • 序列化/反序列化速度要快且紧凑,这是由于金融交易系统中所需的速度要求。与可比较的文本类型消息相比,它的消息要短得多,这意味着您永远不会在一个网络数据包中遇到问题。
  • 无需从传输线上读取。先前该系统采用XML格式,对于调试非常有用,但您可以通过其他方式获取调试输出,并在生产环境中关闭其显示。
  • 它为您的消息提供了自然的结构,以及获取所需部分的API。编写自定义代码需要考虑从二进制数据中提取数字的所有帮助函数,包括边角情况和所有可能性。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接