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

总结

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

(0)

相关推荐

  • 详解Java基础篇--面向对象1(构造方法,static、this关键字)

    面向对象,面向过程的区别.拿下五子棋来说: 面向过程分析: 开始游戏 黑棋先走 绘制画面 判断输赢 轮到白棋 绘制画面 判断输赢 返回步骤2 输出结果 面向对象分析: 黑白双方,双方行为是一模一样的 棋盘系统,负责绘制画面 规则系统,判断犯规.输赢 传统的面向过程编程是思考问题的解决步骤,这种思维方式适用于问题规模较小时.可是当问题规模大,要求程序有更好的可扩展性,能更快速地查错时面向对象设计思想就能体现出其优势.面向对象更接近人类地自然思维方式,将现实世界中的事物抽象为对象和对象的方法. 面向

  • Java Property类使用详解

    概念理解 Properties 继承于 Hashtable.表示一个持久的属性集,属性列表以key-value的形式存在,key和value都是字符串.Properties类被许多Java类使用.例如,在获取环境遍历时它就作为System.getProperties()方法的返回值.我们在很多需要避免硬编码的应用场景下需要使用Properties文件来加载程序需要配置的信息,比如JDBC.MyBatis框架等.Properties类则是Properties文件和程序的中间桥梁,不论是从prope

  • 浅谈Java数值类型的转换与强制转换

    数值类型之间的转换 6个实心箭头箭头表示无信息丢失的转换; 3个虚箭头表示可能有精度损失的转换. 当使用上面两个数值进行二元操作时,先要将两个操作数转换为同一类型,然后再进行计算. 规则:`两个数中小类型的值将自动转换为大类型的值. 小转大可以,但是大转小会损失精度,则需要强制转换. 强制类型转换 语法格式 在圆括号中给出想要转换的目标类型,后面紧跟待转换的变量名. 例: double m = 9.99; int n = (int)m; 其中n的值为9. 强制类型转换通过截断小数部分将浮点值转换

  • 浅谈javascript中的prototype和__proto__的理解

    在工作中有时候会看到prototype和__proto__这两个属性,对这两个属性我一直比较蒙圈,但是我通过查阅相关资料,决定做一下总结加深自己的理解,写得不对的地方还请各位大神指出. 跟__proto__属性相关的两个方法 判断属性是存在实例对象中,还是存在原型对象中的方法 获取或遍历对象中属性的几种方法 1.prototype 每个函数都有一个prototype属性,该属性是一个指针,指向一个对象. 而这个对象的用途是包含由特定类型的所有实例共享的属性和方法.使用这个对象的好处就是可以让所有

  • Java中自动装箱、拆箱引起的耗时详解

    什么是自动装箱,拆箱 先抛出定义,Java中基础数据类型与它们的包装类进行运算时,编译器会自动帮我们进行转换,转换过程对程序员是透明的,这就是装箱和拆箱,装箱和拆箱可以让我们的代码更简洁易懂 耗时问题 在说 Java 的自动装箱和自动拆箱之前,我们先看一个例子. 这个错误我在项目中犯过(尴尬),拿出来共勉! private static long getCounterResult() { Long sum = 0L; final int length = Integer.MAX_VALUE; f

  • 浅谈Java中的参数传递问题

    /* 思考题1:看程序写结果,然后分析为什么是这个样子的.并画图讲解.最后总结Java中参数传递规律. Java中的参数传递问题: 基本类型:形式参数的改变对实际参数没有影响. 引用类型:形式参数的改变直接影响实际参数. */ class ArgsDemo { public static void main(String[] args) { int a = 10; int b = 20; System.out.println("a:"+a+",b:"+b); //a

  • 详解Java变量与常量

    一.常量 用final修饰(也称最终变量) 常量在声明时必须赋初值,赋值后不能再修改值 常量名通常用全大写字母表示 声明时需要添加final或static final类型修饰符,例如: private final int PI=3.141596; //常量,类加载时确定或者更靠后确定值 private static final int PI=3.14159;//静态常量(编译期常量),编译时就确定值(编译为class文件) 二.变量 1.变量类型不同,分配的内存类型也不同 2.无初始化成员变量的

  • vue+element+Java实现批量删除功能

    表格的主要代码段 主要方法是: @selection-change="selsChange <el-table ref="singleTable" v-loading="loading" :data="tableData" stripe @selection-change="selsChange"> <el-table-column type="selection" width=

  • Java异常处理的12条军规总结

    异常的概念 异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的. 比如说,你的代码少了一个分号,那么运行出来结果是提示是错误java.lang.Error:如果你用System.out.println(11/0),那么你是因为你用0做了除数,会抛出java.lang.ArithmeticException的异常. 异常发生的原因有很多,通常包含以下几大类: •用户输入了非法数据. •要打开的文件不存在. •网络通信时连接中断,或者JVM内存溢出. 这些异常有的是因为用

  • 浅谈Java中格式化输出

    格式化控制台输出 要点提示: 在控制台上显示格式化输出:System.out.printf方法 常用的格式标识符 (图片来源: java核心技术卷1(第九版)) 格式标识符的解释 % 4 . 2 f 4为域宽度.输出的浮点数条目宽度至少为4,包括小数点和小数点后两位数字.这样,给小数点前分配了1位数字. 如果该条目小数点前的位数小于1,就在数字前面加空格. 如果该条目小数点前的位数大于7,则自动增加宽度. 2为精度().即想要输出的小数点的长度. f为转换码 指定宽度和精度的例子 举例 输出 %

随机推荐