什么是Protocol Buffers?

Protocol Buffers(协定缓冲区)是一种反对多语言、跨平台、可扩大的机制,用于序列化构造数据格式。相比于XML, JSON, YAML, CSV等一些序列化工具,Protocol Buffers更简略、更快、更轻量。
咱们只需依照咱们的志愿定义一次数据的构造(message),就能够应用非凡生成的代码(能够通过命令行,能够通过Maven插件),轻松地在各种数据流和各种语言之间写入和读取咱们的结构化数据。

Protocol Buffers解决了什么问题?

Protocol Buffers为大小高达几M字节的结构化数据包提供序列化格局。
通过将 结构化的数据 进行 串行化(序列化),从而实现 数据存储 / RPC 数据交换的性能
Protocol Buffers能够应用新信息进行扩大,而不会使现有数据有效或要求更新代码。

序列化: 将 数据结构或对象 转换成 二进制串 的过程
反序列化:将在序列化过程中所生成的二进制串 转换成 数据结构或者对象 的过程

Protocol Buffers是 Google 最罕用的数据格式。通过.proto后缀的文件,来编写Protocol Buffers音讯以及服务。
上面显示了一个示例音讯:

message Person {  optional string name = 1;  optional int32 id = 2;  optional string email = 3;}

proto 编译器在 .proto 文件构建时被调用,以生成各种编程语言的代码来操作相应的Protocol Buffers。
每个生成的类都蕴含每个字段的简略拜访器和办法,用于将整个构造序列化和解析为原始字节。上面展现了一个应用这些生成办法的示例:

Person john = Person.newBuilder()    .setId(1234)    .setName("John Doe")    .setEmail("jdoe@example.com")    .build();output = new FileOutputStream(args[0]);john.writeTo(output);

Protocol Buffers的长处

Protocol Buffers非常适合任何须要以与语言无关、与平台无关、可扩大的形式进行序列化结构化数据的状况。它们通常用于定义通信协议(与gRPC一起)和数据存储。

跨语言的兼容性

目前Google官网反对C++、C#、Java、Kotlin、PHP、Python、Ruby等,其余的能够在github上找到,反对插件的形式。

跨我的项目反对

通过在.proto文件中自定义message,咱们能够跨我的项目应用Protocol Buffers,同时能够将文件搁置在我的项目的代码库之外,比方能够和Java文件夹同目录。
如果咱们冀望定义将在间接团队之外宽泛应用的音讯类型或枚举时,咱们能够将它们放在本人的文件中,而不依赖它们。

反对不更新代码的状况下更新Proto定义

Protocol Buffers不实用的场景

  • Protocol Buffers 偏向于将音讯一次性的加载内存中,并且不会比对象图大。当咱们数据达到数M字节的时候,须要思考其余计划,因为在解决较大的数据时,因为序列化正本的起因,最终咱们会失去数据的多个正本,会导致内存使用量激增,因为倡议最好不要超过1M。

    对象图(Object graph)能够简略了解为对象之间存在援用关系而组成的关系网。在Java中,垃圾收集器基本上应用对象图来确定内存中哪些实例依然链接到某个对象,并且程序可能须要这些实例,哪些实例不再可拜访,因而能够删除。
  • 当Protocol Buffers序列化时,雷同的数据能够有许多不同的二进制序列化。如果不齐全解析两条音讯,就无奈比拟它们是否相等。
  • 音讯不会被压缩。
  • 对于波及大型多维浮点数数组的许多迷信和工程利用,Protocol Buffers音讯在大小和速度上都没有达到最大效率。对于这些应用程序,FITS和相似格局的开销更小。
  • Protocol Buffers音讯自身并不自我形容其数据的能力,但它们具备齐全反射的模式,您能够应用它来实现自我形容。也就是说,如果不拜访其相应的 .proto 文件,您将无奈齐全解释它。

总结成图:

Protocol Buffers如何工作?

下图显示了如何应用协定缓冲区解决数据。

序列化速度快
  • 编码 / 解码 形式简略,通过为位运算来实现。
  • 采纳PB本身的框架代码和编译器共同完成
序列化体积小
  • 采纳了独特的编码方式,如Varint、Zigzag编码方式等等
  • 采纳T - L - V 的数据存储形式:缩小了分隔符的应用 & 数据存储得紧凑

参考:
Protocol Buffers概述