Protostuff序列化和反序列化使用说明

Protostuff序列化和反序列化使用说明google原生的protobuffer使用起来相当麻烦,首先要写.proto文件,然后编译.proto文件,生成对应的.java文件,鄙人试了一次,发现真的很麻烦。而protostuff的官方网站(http://www.protostuff.io/documentation/runtime-schema/),对于智商比较低的小编来说也略显生涩,于是鄙人就根据项目中用到的protostuff,撰写此文,以方便自己和他人加深印象和学习。

大家好,又见面了,我是你们的朋友全栈君。

google原生的protobuffer使用起来相当麻烦,首先要写.proto文件,然后编译.proto文件,生成对应的.java文件,鄙人试了一次,发现真的很麻烦。而protostuff的官方网站(http://www.protostuff.io/documentation/runtime-schema/),对于智商比较低的小编来说也略显生涩,于是鄙人就根据项目中用到的protostuff,撰写此文,以方便自己和他人加深印象和学习。

1.实战

1.maven依赖:

        <dependency>
            <groupId>io.protostuff</groupId>
            <artifactId>protostuff-core</artifactId>
            <version>1.4.0</version>
        </dependency>

        <dependency>
            <groupId>io.protostuff</groupId>
            <artifactId>protostuff-runtime</artifactId>
            <version>1.4.0</version>
        </dependency>

2.ProtoBufUtil工具类:ProtoBufUtil.java
import io.protostuff.LinkedBuffer;
import io.protostuff.ProtobufIOUtil;
import io.protostuff.ProtostuffIOUtil;
import io.protostuff.Schema;
import io.protostuff.runtime.RuntimeSchema;

/**
 * Created by zhangzh on 2017/2/20.
 */
public class ProtoBufUtil {
    public ProtoBufUtil() {
    }

    public static <T> byte[] serializer(T o) {
        Schema schema = RuntimeSchema.getSchema(o.getClass());
        return ProtobufIOUtil.toByteArray(o, schema, LinkedBuffer.allocate(256));
    }

    public static <T> T deserializer(byte[] bytes, Class<T> clazz) {

        T obj = null;
        try {
            obj = clazz.newInstance();
            Schema schema = RuntimeSchema.getSchema(obj.getClass());
            ProtostuffIOUtil.mergeFrom(bytes, obj, schema);
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }

        return obj;
    }
}

  3. bean类Student.java:    
import io.protostuff.Tag;

/**
 * Created by zhangzh on 2017/2/20.
 */
public class Student {

    @Tag(1)
    private String name;
    @Tag(2)
    private String studentNo;
    @Tag(3)
    private int age;
    @Tag(4)
    private String schoolName;

   // 关于@Tag,要么所有属性都有@Tag注解,要么都没有,不能一个类中只有部分属性有@Tag注解

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getStudentNo() {
        return studentNo;
    }

    public void setStudentNo(String studentNo) {
        this.studentNo = studentNo;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getSchoolName() {
        return schoolName;
    }

    public void setSchoolName(String schoolName) {
        this.schoolName = schoolName;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", studentNo='" + studentNo + '\'' +
                ", age=" + age +
                ", schoolName='" + schoolName + '\'' +
                '}';
    }
}

3.test类ProtoBufUtilTest.java:  
import java.util.Arrays;

/**
 * Created by zhangzh on 2017/2/20.
 */
public class ProtoBufUtilTest {

    public static void main(String[] args) {

        Student student = new Student();
        student.setName("lance");
        student.setAge(28);
        student.setStudentNo("2011070122");
        student.setSchoolName("BJUT");

        byte[] serializerResult = ProtoBufUtil.serializer(student);

        System.out.println("serializer result:" + Arrays.toString(serializerResult));

        Student deSerializerResult = ProtoBufUtil.deserializer(serializerResult,Student.class);

        System.out.println("deSerializerResult:" + deSerializerResult.toString());
    }

}

4.输出结果:  

serializer result:[10, 5, 108, 97, 110, 99, 101, 18, 10, 50, 48, 49, 49, 48, 55, 48, 49, 50, 50, 24, 28, 34, 4, 66, 74, 85, 84]
deSerializerResult:Student{name='lance', studentNo='2011070122', age=28, schoolName='BJUT'}

看,简单吧!

 参考资料:1. protostuff官方网站.

                     2. Protostuff序列化.

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/149567.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • DLL注入

    DLL注入DLL注入DLL注入原理dll注入实现过程功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML图表FLowchart流程图导出与导入导出导入DLL注入原理在Windows操作系统中,运行的每一个进程都生活在自己的程序空间中(保护模式),每一个进程都认为自己拥有整个机器的控制权,

    2022年5月17日
    64
  • 伊甸园_绿田园农业

    伊甸园_绿田园农业近日,经国务院批复,《全国高标准农田建设规划(2021-2030年)》(以下简称《规划》)正式印发实施。《规划》指出,到2035年,通过持续改造提升,全国高标准农田保有量和质量进一步提高,绿色农田、数字农田建设模式进一步普及,支撑粮食生产和重要农产品供给能力进一步提升,形成更高层次、更有效率、更可持续的国家粮食安全保障基础。《规划》要求利用数字技术,推动农田建设、生产、管护相融合,提高全要素生产效率。重点推进物联网、大数据、移动互联网、智能控制、卫星定位等信息技术在农田建设中的应用,配套耕地质量综合监测点

    2022年10月21日
    3
  • 【Android 】零基础到飞升 | ExpandableListView(可折叠列表)的基本使用

    【Android 】零基础到飞升 | ExpandableListView(可折叠列表)的基本使用2.5.5ExpandableListView(可折叠列表)的基本使用本节引言:本节要讲解的Adapter类控件是ExpandableListView,就是可折叠的列表,它是ListView的子类,在ListView的基础上它把应用中的列表项分为几组,每组里又可包含多个列表项。至于样子,类似于QQ联系人列表,他的用法与ListView非常相似,只是ExpandableListVivew显示的列表项需由ExpandableAdapter提供。下面我们来学习这个控件的基本使用!官方API:Exp

    2022年6月15日
    23
  • UCML应用框架平台的特点

    UCML应用框架平台的特点lUCML应用框架平台的特点1.UCML具有集成的、可编译的开发环境(1)该框架具有数据访问对象、业务对象、业务模版、工作流设计、业务规则设计、报表定义等组成部分,涵盖了一个业务系统开发所需的技术实现及细节;(2…

    2025年7月4日
    5
  • Java集合篇:HashMap原理详解(JDK1.7及之前的版本)

    Java集合篇:HashMap原理详解(JDK1.7及之前的版本)

    2021年10月4日
    34
  • vmware虚拟机(四)之安装centos7图形界面Linux

    vmware虚拟机(四)之安装centos7图形界面Linux1.创建新的虚拟机2.根据提示一步一步操作,这里可以选择推荐的,也可以选择自定义3.虚拟机硬件兼容性一般选择默认的,即次虚拟机支持的最新版本,下面是一些兼容产品和限制,此虚拟机可安装的最大内存为64GB,处理器数目最多为16个。。。。4.为了练习安装Linux操作系统,我们选择稍后安装操作系统5.根据自己需要的操作系统版本选择,这里我们选择centos64位的Linux6.虚…

    2022年5月27日
    41

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号