protobuf序列化协议
Protobuf (Protocol Buffers) 是谷歌开发的一款无关平台,无关语言,可扩展,轻量级高效的序列化结构的数据格式,用于将自定义数据结构序列化成字节流,和将字节流反序列化为数据结构。所以很适合做数据存储和为不同语言,不同应用之间互相通信的数据交换格式,只要实现相同的协议格式,即后缀为 proto 文件被编译成不同的语言版本,加入各自的项目中,这样不同的语言可以解析其它语言通过 Protobuf 序列化的数据。目前官方提供 c++,java,go 等语言支持。
Protobuf 应用场景
对于protobuf的使用场景,简单来说,业务要求命中其优点越多,缺点越少,就更能够使用Protobuf,比如说在某些场景对消息大小很敏感,或者传输的数据量不大,比如说APP登录场景,那么可以考虑使用Protobuf
选择序列化协议需要考虑哪些
- 序列化之后的数据流的大小(占用网络带宽),对于高并发的场景下这点很重要。
- 序列化和反序列化的性能(占用CPU和内存资源)。
- 是否支持多语言(可能团队不同的模块使用了不同的开发语言)。
常见数据交互格式对比
- JSON (JavaScript Object Notation):一般用于WEB项目中,因为浏览器对JSON格式的数据支持非常好,大部分编程语言有很多内建函数支持,而且JSON几乎支持所有编程语言。
- XML:XML在WebService中的应用比较多,相比于JSON,它的数据更加冗余,因为需要成对的闭合标签,而JSON使用了键值对的方式,不仅压缩了一定的数据空间,同时也有更好的可读性。
- Protobuf:谷歌公司新开发的一种数据格式,适合高性能,对响应速度有要求的数据传输场景。因为 Protobuf 是二进制数据格式,需要编码和解码。数据本身不具有可读性,因此只能反序列化得到可读数据。
相对于其他数据格式 Protobuf 的优势
- 序列化后体积比JSON和XML小,适合网络传输。
- 序列化反序列化速度快,比JSON的处理速度快。
- 消息格式升级和兼容性还不错。
Protobuf 的序列化与反序列化
- 序列化:将数据结构或者对象转化成二进制串的过程。
- 反序列化:将序列化过程中所产生的二进制串转换成数据结构或对象的过程。
Protobuf 的优点和缺点
优点:
- Protobuf序列化速度快,序列化后的体积比xml更小,传输更快。使用相对也简单,因为Proto编译器能自己序列化和反序列化。
- 可以定义自己的数据结构,然后使用代码生成器去生成的代码来读写这个数据结构,甚至可以在不用重新部署的情况下来更新这个数据结构,只需要使用Protobuf对数据结构进行一次描述,就可以利用不同的语言或者从不同的数据流对你的结构化数据轻松的读写。
- 向后兼容性好,不需要破坏旧的数据格式,依靠老的数据格式的程序就可以对数据结构更新。
- 语义比xml更加清晰,无需类似xml解析器的东西(因为Protobuf编译器会将.proto文件编译成对应的数据访问用以对Protobuf数据进行序列化和反序列化操作)。
- 跨平台,跨语言,可扩展性好。
- 维护成本比较低,多个平台只需要维护一套.proto对象协议文件。
- 加密性好。
缺点:
- Protobuf功能简单,无法用来表示复杂的概念。
- 相比 xml,xml 具有某种程度的自解释性,因为最终是转成二进制流,不像 xml 和 json 能够直接查看明文。
那么为什么不直接使用 XML
同XML相比,Protobuf的优势在于高性能,它以高效的二进制存储方式比XML小3到10倍,快20到100倍,原因在于:
- ProtoBuf序列化后所生成的二进制消息非常紧凑。
- ProtoBuf封解包过程非常简单。
protobuf 对传输的数据采取一种最简单的 key-value 形式的存储方式(但其中有一种类型的数据不是 k-v 形式,后面会讲),这钟存储方式极大的节省了空间。除此之外 protobuf 还采取了 varint(变长编码)形式来压缩数据,对体积较小的字段分配较少的空间,由此使得压缩后的文件非常“紧凑”。
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 程序员小航
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果