当前位置: 首页 > 工具软件 > jprotobuf > 使用案例 >

Java序列化神器——Jprotobuf(小白篇)

狄灵均
2023-12-01
proto开发神器——Jprotobuf(小白篇)
前言:
最近对一个项目做升级,内部有大对象需要存储到缓存上去,考虑到存储资源和性能问题,我们决定对生成的对象进行压缩,首先想到的是gzip压
缩,但是架构开始的时候,同事张某提议使用Google 的proto,发了几个文档看了一下,上手有点懵,这玩意的使用比对象转json压缩可复杂太多了,让人
有点恶心:于是乎,同事张某又发了一个插件(百度开发的),据说这个插件比原来使用简单的多,这是接入文档: https://segmentfault.com/a
/1190000039200121 ,但是,我看了一会,我认为这个接入文档写的一点也不简单,写得挺全乎但是文章结构散乱,而且很多没必要出现的东西会误导新人的
使用,因此我认为这个更适合已经成功接入并使用的人进一步考究,下面我整理一个小白入门文档,看完这篇,小时牛刀后你就能继续看上边提到的说明文
档,最后你可以去看官方文档;
proto的有点和说明我这里不再赘述,网上一堆

一、官方使用方法(没有插件前)

1、你需要去官网下载: protoc.exe 
2、你需要 定义.proto说明文件,举个栗子:你需要对一个名叫Student的类的对象进行序列化压缩,那么你就要写一个文件:Student.proto,至于这个文件
内容,参考上面那个链接
3、使用protoc.exe 编译.proto文件
4、编译生成的Java文件,利用protobuf API进行序列化与反序化操作
对了,你还要再项目里面引入相关依赖,这个我忘记说了......
怎末,是不是很恶心,要不是项目需要,鬼愿意使用这玩意

二、使用这个插件(入门版)

1、引入依赖(SLF4J相关依赖请自行引入)
<!-- jprotobuf -->
<dependency>
 <groupId>com.baidu</groupId>
 <artifactId>jprotobuf</artifactId>
 <version>2.4.5</version>
</dependency>
<dependency>
 <groupId>com.baidu</groupId>
 <artifactId>jprotobuf-precompile-plugin</artifactId>
 <version>2.2.2</version>
</dependency>
2、写两个类(写一个也行),我这里写了Student和Teacher两个类
@Data
@ProtobufClass
public class StudentPo extends PersonPo{
 @Protobuf(fieldType= FieldType.STRING, order=1)
 private String schoolName;
 @Protobuf(fieldType= FieldType.INT32, order=2)
 private Integer grade;
 @Protobuf(fieldType= FieldType.OBJECT, order=3)
 private List<TeacherPo> teacherPos;
}
@Data
@ProtobufClass
public class TeacherPo{
 private String name;
 private Integer age;
 private Integer sex;
}
3、直接写一个main方法 。。。操作
public static void main(String[] args) {
 System.out.println("main");
 StudentPo student = createStudentEntity();
 try {
     // 
     String jsonT = JSON.toJSONString(student);
     byte[] bytes = jsonT.getBytes();
     System.out.println(""+bytes.length);
     //
     //Protobuf
     // 
     Codec<StudentPo> studentPoCodec = ProtobufProxy.create(StudentPo.class);
     byte[] bb = studentPoCodec.encode(student);
     System.out.println(""+bb.length);
     // 
     StudentPo newStudent = studentPoCodec.decode(bb);
     System.out.println(""+JSON.toJSONString(newStudent));
 } catch (Exception e) {
     e.printStackTrace();
}

//
public static StudentPo createStudentEntity(){
 StudentPo student = new StudentPo();
 student.setName("");
 student.setGrade(5);
 student.setAge(20);
 student.setSex(1);
 student.setSchoolName("");
 TeacherPo teacher = new TeacherPo();
 teacher.setAge(28);
 teacher.setSex(0);
 teacher.setName("");
 List<TeacherPo> teacherPos = new ArrayList<TeacherPo>();
 teacherPos.add(teacher);
 student.setTeacherPos(teacherPos);
 return student;
}

 类似资料: