【序列化和反序列化】JProtobuf

一、JProtobuf介绍

jprotobuf是针对JAVA程序开发的一套简易类库,目的是简化JAVA语言对protobuf类库的使用。使用jprotobuf可以无需再去了解proto文件操作与语法,直接使用JAVA注解定义字段类型即可

github地址:https://github.com/jhunters/jprotobuf

二、原理

  1. 扫描类上的注解的信息,进行分析(与protobuf读取proto文件进行分析过程相似)
  2. 根据注解分析的结果,动态生成java代码进行protobuf序列化与反序列化功能实现
  3. 使用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();
        }
    }

}

 

 

posted @ 2022-12-06 17:58  harara  阅读(564)  评论(0编辑  收藏  举报