缘起
平常程序要进行网络通讯,数据交换的时候,我们常用的数据传递方式就是 json 或者xml,但是json与xml进行数据传递,在网络传输过程中是透明的(除非服务端与客户端进行加密解密处理)通过 抓包工具 就可以知道你服务或者接口间传递的数据格式,怎么通过一些方案来解决这个问题呢(先不考虑服务端客户端接口加密方式,因为一些小型项目完全没有必要任意接口都加密),所以这种情况下搜索了Protobuf,这个出师名门的家伙网络传输直接是二进制流,完全可以解决我们的问题
简介
Protobuf是出自 谷歌 的一个数据交互方式,解决谷歌内部服务间传递数据,谷歌这个全球数一数二的公司随便一个业务都是TB, PB 级别的,假如采用xml进行数据交互,xml的反序列化特别慢,很消耗性能,所以数据交换性能提高哪怕1%,这效果都是特别明显的,谷歌向来不缺乏造轮子的牛人,造出了序列号与反序列化变态快,占用空间又很小的Protobuf
优缺点
优点
性能好,效率高,网络传输占用空间小
代码有生成机制,数据解析类自动生成
支持 向后兼容 和向前兼容
支持多种 编程语言 ( java ,golang, c++ , python 等)
缺点
二进制格式导致可读性差
应用不够广发,相关文档资源不够全面
实例
maven 依赖
<dependency>
编写.proto文件Person-entity.proto
option java_outer_classname = "PersonEntity";//生成的数据访问类的类名 message Person {
使用protoc.exe编译成java类
在cmd命令窗口里输入以下命令,并且进行替换相关目录protoc.exe -I=proto的输入目录 --java_out=java类输出目录 proto的输入目录包括包括proto文件
测试
public static void main(String[] args) throws IOException { //模拟将对象转成 byte [],方便传输
参考
protobuf GitHub
proto协议