protobuf 是Google旗下的一款平台无关、语言无关,可扩展的序列化结构数据格式。所以很适合用做数据存储和作为不同应用、不同语言之间相互通信的数据交换格式,只要实现相同的协议格式的统一proto文件,就可以被编译程不同语言版本,从而加入各自的工程中。这样不同语言之间可以解析其它语言通过protobuf序列化的数据。 目前protobuf官网提供了C++,C#,Dart,GO,JAVA,Kotlin,Python等语言支持。Google在2008年7月7号将其作为开源项目对外公布。
1. ProtoBuf 简介
Google Protocol Buffers (简称protobuf)是一种平台无关、语言无关、可扩展的轻便高效的序列化数据存储格式。
2. 数据交互的格式比较
2.1 数据交互XML、json、protobuf之间的比较
- json:一般的web项目中,最流行的还是json。因为浏览器对json数据非常友好,有很多内建的函数支持;
- xml:在web service中应用最为广泛,但是相比于json,它的数据更加冗余,因为需要成对的闭合标签。而json使用的键值对,不仅压缩了一定的数据空间,同时也具有可读性。
- protobuf:是后起之秀,是谷歌开源的一种数据格式,适合高性能,对响应速度有要求的数据传输场景。因为protobuf是二进制数据格式,需要编码和解码。数据本身不具备可读性,只能通过反序列化来得到真正可读的数据。
2.2 相比于其它数据格式,protobuf更具有优势
- 序列化后体积相比json和XML很小,很适合网络传输;
- 支持跨平台多种语言;
- 序列化反序列速度很快,快于json的处理速度;
- 消息格式升级和兼容性不错。
3. ProtoBuf的优缺点
3.1 优点
- 更小更快更简单
- 可以定义自己的数据结构:
○ 使用代码生成器生成的代码来读写这个数据结构; ○ 可以在无需重新部署程序的情况下,更新数据结构; ○ 只需要使用ProtoBuf对数据结构进行依次描述,就可以利用不同语言或从各种不同数据流中实现对结构化数据的轻松读写; - 向后兼容:
○ 不必破坏已经部署的、依靠老数据格式的程序就可以实现对数据结构进行升级。 - 语义更清晰
○ 无需类似XML解析器的东西 因为ProtoBuf编译器会将.proto文件生成对应的数据访问类,从而实现对protobuf数据的序列化与反序列化操作; - 简单易学
○ 使用protobuf无需学习复杂的文档对象模型,protobuf比较友好,并且有良好的文档和示例。
3.2 缺点
protobuf与XML相比也有不足之处:
- 功能简单,无法用来表示复杂的概念。
- XML已经是多种行业标准的编写工具,而Protobuf是Google内部使用的工具。在通用性上差很多。
- 不适用于对基于文本的标记文档(如HTML)建模,因为文本并不适合用来描述数据结构;
- XML具有某种程度的自解释性,它可以被人直接读取编辑;而protobuf是以二进制的方式存储,除非有.proto定义,否则无法解析。
|