当前位置:首页 > Web开发 > 正文

JSON编译库使用Google提供的GSON库

2024-03-31 Web开发

ProtoBuf 是google团队开发的用于高效存储和读取布局化数据的工具。什么是布局化数据呢,正如字面上表达的,就是带有必然布局的数据。好比电话簿上有很多记录数据,每笔记录包罗姓名、ID、邮件、电话等,这种布局反复呈现。

同类

XML、JSON 也可以用来存储此类布局化数据,但是使用ProtoBuf暗示的数据能越发高效,并且将数据压缩得更小。

道理

ProtoBuf 是通过ProtoBuf编译器将与编程语言无关的特有的 .proto 后缀的数据布局文件编译成各个编程语言(Java,C/C++,Python)专用的类文件,然后通过Google供给的各个编程语言的撑持库lib即可挪用API。(关于proto布局体怎么编写,可自行查阅文档)

ProtoBuf编译器安置

Mac : brew install protobuf

举个例子 1. 先创建一个proto文件

message.proto

syntax = "proto3"; message Person { int32 id = 1; string name = 2; repeated Phone phone = 4; enum PhoneType { MOBILE = 0; HOME = 1; WORK = 2; } message Phone { string number = 1; PhoneType type = 2; } } 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\n", personOut.getId(), personOut.getName()); List<Message.Person.Phone> phoneList = personOut.getPhoneList(); for (Message.Person.Phone phone : phoneList) { System.out.printf("手机号:%s (%s)\n", phone.getNumber(), phone.getType()); } 对照

为了能浮现ProtoBuf的优势,我写了同样布局体的Java类,并且将Java东西转换成JSON数据,来与ProtoBuf进行对照。JSON编译库使用Google供给的GSON库,JSON的部分代码就不贴出来了,直接展示功效

对照功效功效

运行 1 次

【 JSON 开始编码 】 JSON 编码1次,耗时:22ms JSON 数据长度:106 -开始解码- JSON 解码1次,耗时:1ms 【 ProtoBuf 开始编码 】 ProtoBuf 编码1次,耗时:32ms ProtoBuf 数据长度:34 -开始解码- ProtoBuf 解码1次,耗时:3ms

运行 10 次

【 JSON 开始编码 】 JSON 编码10次,耗时:22ms JSON 数据长度:106 -开始解码- JSON 解码10次,耗时:4ms 【 ProtoBuf 开始编码 】 ProtoBuf 编码10次,耗时:29ms ProtoBuf 数据长度:34 -开始解码- ProtoBuf 解码10次,耗时:3ms

运行 100 次

【 JSON 开始编码 】 JSON 编码100次,耗时:32ms JSON 数据长度:106 -开始解码- JSON 解码100次,耗时:8ms 【 ProtoBuf 开始编码 】 ProtoBuf 编码100次,耗时:31ms ProtoBuf 数据长度:34 -开始解码- ProtoBuf 解码100次,耗时:4ms

运行 1000 次

【 JSON 开始编码 】 JSON 编码1000次,耗时:39ms JSON 数据长度:106 -开始解码- JSON 解码1000次,,耗时:21ms 【 ProtoBuf 开始编码 】 ProtoBuf 编码1000次,耗时:37ms ProtoBuf 数据长度:34 -开始解码- ProtoBuf 解码1000次,耗时:8ms

运行 1万 次

【 JSON 开始编码 】 JSON 编码10000次,耗时:126ms JSON 数据长度:106 -开始解码- JSON 解码10000次,耗时:93ms 【 ProtoBuf 开始编码 】 ProtoBuf 编码10000次,耗时:49ms ProtoBuf 数据长度:34 -开始解码- ProtoBuf 解码10000次,耗时:23ms

运行 10万 次

【 JSON 开始编码 】 JSON 编码100000次,耗时:248ms JSON 数据长度:106 -开始解码- JSON 解码100000次,耗时:180ms 【 ProtoBuf 开始编码 】 ProtoBuf 编码100000次,耗时:51ms ProtoBuf 数据长度:34 -开始解码- ProtoBuf 解码100000次,耗时:58ms 总结 编解码性能

上述栗子只是简单的采样,实际上据我的尝试发明

次数在1千以下,ProtoBuf 的编码与解码性能,都与JSON八两半斤,甚至还有比JSON差的趋势。

次数在2千以上,ProtoBuf的编码解码性能,都比JSON超出跨越很多。

次数在10万以上,ProtoBuf的编解码性能就很明显了,远远超出跨越JSON的性能。

内存占用

ProtoBuf的内存34,而JSON达到106 ,ProtoBuf的内存占用只有JSON的1/3.

结尾

其实此次尝试有很多可待优化的处所,就算是这种大略的测试,也能看出来ProtoBuf的优势。

兼容 新增字段

在proto文件中新增 nickname 字段

生成Java文件

用老proto字节数组数据,转换成东西

Id:1994, Name:XIAOLEI 手机号:100860 (HOME) 手机号:100100 (MOBILE) getNickname=

功效,是可以转换告成。

删除字段

在proto文件中删除 name 字段

生成Java文件

用老proto字节数组数据,转换成东西

Id:1994, Name:null 手机号:100860 (HOME) 手机号:100100 (MOBILE)

功效,是可以转换告成。

END

ProtoBuf试用与JSON的对照

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/web/32195.html