一、引言
在前面《释放你九成的带宽和内存:GZIP在解决Redis大Key方面的应用》一文中我使用GZIP算法可以将JSON格式数据的大小缩小88%从而节省了大量的存储和带宽资源,本文介绍另一种JAVA对象序列化神器——ProtoBuf
(Protocol Buffers(),它是由 Google 开发的一种用于序列化结构化数据的高效、灵活且语言中立的协议。它被广泛用于数据通信、数据存储、RPC(远程过程调用)等场景,特别是在分布式系统和微服务架构中。Protobuf 序列化后的数据体积通常比 JSON、XML 小很多,而且占用更少的带宽和存储空间,且解析速度更快。但是相对于 JSON、XML 等文本格式可读性差,使用比较麻烦,最主要是增加了开发和编译的步骤(需要使用 protoc 编译 .proto 文件),本文介绍JProtoBuf神器,像使用JSON一样使用Protobuf。
二、Quick Start
JProtobuf
是一个基于Java的Protobuf序列化与反序列化工具,它由百度开发并开源的,旨在简化 Protobuf 在 Java 项目中的使用门槛。JProtobuf
提供了一种更符合Java开发者习惯的方式来定义和操作Protobuf数据,无需使用.proto 文件和编译工具,项目GitHub地址:
JProtobuf
:https://github.com/jhunters/jprotobuf
使用JProtobuf只需要三步就能完成JAVA对象和Protobuf数据之间的相互转换:
- 第一步,添加Maven依赖:
<dependency>
<groupId>com.baidu</groupId>
<artifactId>jprotobuf</artifactId>
<version>2.4.23</version>
</dependency>
- 第二步,对象添加@ProtobufClass注解
@Data
@ProtobufClass
public class User {
private Long id;
private String name;
private String trueName;
private Integer age;
private String sex;
private Date createTime;
}
- 第三步,创建ProtobufProxy创建代理并使用
User user = new User();
user.setId(1L);
user.setName("赵侠客");
user.setAge(29);
user.setSex("男");
user.setTrueName("公众号");
user.setCreateTime(new Date());
//创建JProtobuf代理
Codec<User> codec = ProtobufProxy.create(User.class);
//使用Protobuf序列化
byte[] bytes = codec.encode(user);
System.out.println(bytes.length); //38
//使用Protobuf反序列化
User user1 = codec.decode(bytes);
通过上面的代码可以看出使用JProtobuf来完成对象的序列化和使用JSON序列化对象是一样的简单,其中Protobuf序列化后的字节长度是38,JSON的字节长度为98,足足节省了61%
。当然并不是所有对象使用Protobuf后大小和JSON都会有这么大的差距,接下来我们对比一下中JSON
和大JSON
序列化后大小差距。
三、大小对比
3.1 中JSON大小对比
这里我们参考前面一文《FastJson、Jackson、Gson、Hutool,JSON解析哪家强?JMH基准测试来排行》对