介绍
ProtoBuf 是google团队开发的用于高效存储和读取结构化数据的工具。什么是结构化数据呢,正如字面上表达的,就是带有一定结构的数据。比如电话簿上有很多记录数据,每条记录包含姓名、ID、邮件、电话等,这种结构重复出现。
同类
XML、JSON 也可以用来存储此类结构化数据,但是使用ProtoBuf表示的数据能更加高效,并且将数据压缩得更小。
原理
Protobuf是一个网络通信协议,提供了高效率的序列化和反序列化机制,序列化就是把对象转换成二进制数据发送给服务端,反序列化就是将收到的二进制数据转换成对应的对象。(关于proto结构体怎么编写,可自行查阅文档)
举个例子
1. 先创建一个proto文件
message.proto
2. 创建一个Java项目
并且将proto文件放置 src/main/proto 文件夹下
3. 编译proto文件至Java版本
- 用命令行 cd 到 src/main 目录下
- 终端执行命令 : protoc --java_out=./java ./proto/*.proto
- 会发现,在你的src/main/java 里已经生成里对应的Java类
4. 依赖Java版本的ProtoBuf支持库
这里只举一个用Gradle使用依赖的栗子
implementation 'com.google.protobuf:protobuf-java:3.9.1'
5. 将Java对象转为ProtoBuf数据
Message.Person.Phone.Builder phoneBuilder = Message.Person.Phone.newBuilder();Message.Person.Phone phone1 = phoneBuilder .setNumber("100860") .setType(Message.Person.PhoneType.HOME) .build();Message.Person.Phone phone2 = phoneBuilder .setNumber("100100") .setType(Message.Person.PhoneType.MOBILE) .build();Message.Person.Builder personBuilder = Message.Person.newBuilder();personBuilder.setId(1994);personBuilder.setName("XIAOLEI");personBuilder.addPhone(phone1);personBuilder.addPhone(phone2);Message.Person person = personBuilder.build();long old = System.currentTimeMillis();byte[] buff = person.toByteArray();System.out.println("ProtoBuf 编码耗时:" + (System.currentTimeMillis() - old));System.out.println(Arrays.toString(buff));System.out.println("ProtoBuf 数据长度:" + buff.length);
6. 将ProtoBuf数据,转换回Java对象
System.out.println("-开始解码-");old = System.currentTimeMillis();Message.Person personOut = Message.Person.parseFrom(buff);System.out.println("ProtoBuf 解码耗时:" + (System.currentTimeMillis() - old));System.out.printf("Id:%d, Name:%s