【序列化和反序列化】JProtobuf
一、JProtobuf介绍
jprotobuf是针对JAVA程序开发的一套简易类库,目的是简化JAVA语言对protobuf类库的使用。使用jprotobuf可以无需再去了解proto文件操作与语法,直接使用JAVA注解定义字段类型即可
github地址:https://github.com/jhunters/jprotobuf
二、原理
- 扫描类上的注解的信息,进行分析(与protobuf读取proto文件进行分析过程相似)
- 根据注解分析的结果,动态生成java代码进行protobuf序列化与反序列化功能实现
- 使用JDK6及以上的code compile API进行编译后加载到Classloader
三、性能
jprotobuf主要性能消耗在扫描类上注解,动态生成代码编译的过程。在执行序列化与反序列化的过程中,几乎与protobuf生成的代码效率等同。如果使用预编译插件,这无需运行中进行代码生成与编译,效率更高。
四、JProtobuf用法
maven
<!-- jprotobuf --> <dependency> <groupId>com.baidu</groupId> <artifactId>jprotobuf</artifactId> <version>2.4.12</version> </dependency> <!-- 预编译插件 --> <dependency> <groupId>com.baidu</groupId> <artifactId>jprotobuf-precompile-plugin</artifactId> <version>2.2.2</version> </dependency>
代码
实体类,加上@ProtobufClass注解,必须有默认的无参构造函数
package com.chenly.serialize.bean; import com.baidu.bjf.remoting.protobuf.annotation.ProtobufClass; import lombok.Data; import lombok.experimental.SuperBuilder; import java.io.Serializable; /** * @author: chenly * @date: 2022-11-25 11:01 * @description: * @version: 1.0 */ @Data @SuperBuilder @ProtobufClass public class Score implements Serializable { //班级 private String className; //学生姓名 private String stuName; //课程 private String course; //分数 private double score; public Score(){ } }
序列化与反序列化实现
package com.chenly.serialize.jprotobuf; import com.baidu.bjf.remoting.protobuf.Codec; import com.baidu.bjf.remoting.protobuf.ProtobufProxy; import com.chenly.serialize.bean.Score; import java.io.IOException; /** * * @author: chenly * @date: 2022-11-28 15:32 * @description: * @version: 1.0 */ public class JprotobufTest { public static void main(String[] args) { Score score1 = Score.builder() .className("一班") .stuName("张三").course("生物").score(90).build(); Codec codec = ProtobufProxy.create(Score.class); byte[] bytes ; Object object = null; try { //序列化 bytes = codec.encode(score1); //反序列化 object = codec.decode(bytes); System.out.println(object); } catch (IOException e) { e.printStackTrace(); } } }
作者:小念
本文版权归作者和博客园共有,欢迎转载,但必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。