七叶笔记 » golang编程 » protobuf学习

protobuf学习

缘起

平常程序要进行网络通讯,数据交换的时候,我们常用的数据传递方式就是 json 或者xml,但是json与xml进行数据传递,在网络传输过程中是透明的(除非服务端与客户端进行加密解密处理)通过 抓包工具 就可以知道你服务或者接口间传递的数据格式,怎么通过一些方案来解决这个问题呢(先不考虑服务端客户端接口加密方式,因为一些小型项目完全没有必要任意接口都加密),所以这种情况下搜索了Protobuf,这个出师名门的家伙网络传输直接是二进制流,完全可以解决我们的问题

简介

Protobuf是出自 谷歌 的一个数据交互方式,解决谷歌内部服务间传递数据,谷歌这个全球数一数二的公司随便一个业务都是TB, PB 级别的,假如采用xml进行数据交互,xml的反序列化特别慢,很消耗性能,所以数据交换性能提高哪怕1%,这效果都是特别明显的,谷歌向来不缺乏造轮子的牛人,造出了序列号与反序列化变态快,占用空间又很小的Protobuf

优缺点

  • 优点

  1. 性能好,效率高,网络传输占用空间小

  2. 代码有生成机制,数据解析类自动生成

  3. 支持 向后兼容 和向前兼容

  4. 支持多种 编程语言 java ,golang, c++ python 等)

  • 缺点

  1. 二进制格式导致可读性差

  2. 应用不够广发,相关文档资源不够全面

实例

  • 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协议

相关文章