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

 更新时间:2019年04月08日 17:28:53   作者:zhglance   我要评论
今天小编就为大家分享一篇关于Protostuff序列化和反序列化的使用说明,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

大家都知道protobuf好用,可是在网上找到的netty整合protobuf的文章都是千篇一律,自己编写proto文件然后使用工具转java文件用起来复杂麻烦,经过不懈努力终于找到了一个简单的方法希望大家喜欢。

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'}

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。如果你想了解更多相关内容请查看下面相关链接

相关文章

  • java中的常见关键字解析

    java中的常见关键字解析

    这篇文章主要介绍了java中的常见关键字,需要的朋友可以参考下
    2014-08-08
  • 如何调试报表插件

    如何调试报表插件

    在项目开发过程中插件调试非常的麻烦,需要修改里面的代码,编译出class,需要重新打包插件。然后把之前的删除,重新安装最新的。调试过程比较繁琐,而且不能调试,十分的不方便,这篇文章主要介绍的是调试报表插件的方法,需要的朋友可以参考下
    2015-07-07
  • Java集合基础知识 List/Set/Map详解

    Java集合基础知识 List/Set/Map详解

    这篇文章主要介绍了Java集合基础知识 List/Set/Map,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • 深入分析Android系统中SparseArray的源码

    深入分析Android系统中SparseArray的源码

    这篇文章主要介绍了深入分析Android系统中SparseArray的源码,SparseArray为Java实现,需要的朋友可以参考下
    2015-07-07
  • IDEA配置使用Maven Helper插件的方法(详细配置)

    IDEA配置使用Maven Helper插件的方法(详细配置)

    这篇文章主要介绍了Maven Helper插件IDEA配置使用(详细配置),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-12-12
  • 通过一个map替换字符串中指定的字符变量方法

    通过一个map替换字符串中指定的字符变量方法

    下面小编就为大家带来一篇通过一个map替换字符串中指定的字符变量方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • Java多种方式动态生成doc文档

    Java多种方式动态生成doc文档

    这篇文章主要为大家详细介绍了Java动态生成doc文档的多种方式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-09-09
  • spring-boot使用Admin监控应用的方法

    spring-boot使用Admin监控应用的方法

    本篇文章主要介绍了spring-boot使用Admin监控应用的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • Spring Boot + Kotlin整合MyBatis的方法教程

    Spring Boot + Kotlin整合MyBatis的方法教程

    前几天由于工作需要,便开始学习了kotlin,java基础扎实学起来也还算比较快,对于kotlin这个编程语言自然是比java有趣一些,下面这篇文章主要给大家介绍了关于Spring Boot + Kotlin整合MyBatis的方法教程,需要的朋友可以参考下。
    2018-01-01
  • Java实现AOP面向切面编程的实例教程

    Java实现AOP面向切面编程的实例教程

    这篇文章主要介绍了Java实现AOP面向切面编程的实例教程,通常Java中的AOP都是利用Spring框架中造好的轮子来开发,而本文则关注于Java本身AOP的设计模式实现,需要的朋友可以参考下
    2016-04-04

最新评论