首页 > 编程 > Java > 正文

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

2019-11-26 09:06:39
字体:
来源:转载
供稿:网友

大家都知道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'}

总结

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

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表