Protostuff序列化和反序列化的使用说明
大家都知道protobuf好用,可是在网上找到的netty整合protobuf的文章都是千篇一律,自己编写proto文件然后使用工具转java文件用起来复杂麻烦,经过不懈努力终于找到了一个简单的方法希望大家喜欢。
google原生的protobuffer使用起来相当麻烦,首先要写.proto文件,然后编译.proto文件,生成对应的.java文件,鄙人试了一次,发现真的很麻烦。而protostuff的官方网站(http://www.protostuff.io/documentation/runtime-schema/),对于智商比较低的小编来说也略显生涩,于是鄙人就根据项目中用到的protostuff,撰写此文,以方便自己和他人加深印象和学习。
1.实战
1.maven依赖:
io.protostuff protostuff-core 1.4.0 io.protostuff protostuff-runtime 1.4.0
2.ProtoBufUtil工具类:ProtoBufUtil.java
importio.protostuff.LinkedBuffer;
importio.protostuff.ProtobufIOUtil;
importio.protostuff.ProtostuffIOUtil;
importio.protostuff.Schema;
importio.protostuff.runtime.RuntimeSchema;
/**
*Createdbyzhangzhon2017/2/20.
*/
publicclassProtoBufUtil{
publicProtoBufUtil(){
}
publicstaticbyte[]serializer(To){
Schemaschema=RuntimeSchema.getSchema(o.getClass());
returnProtobufIOUtil.toByteArray(o,schema,LinkedBuffer.allocate(256));
}
publicstaticTdeserializer(byte[]bytes,Classclazz){
Tobj=null;
try{
obj=clazz.newInstance();
Schemaschema=RuntimeSchema.getSchema(obj.getClass());
ProtostuffIOUtil.mergeFrom(bytes,obj,schema);
}catch(InstantiationExceptione){
e.printStackTrace();
}catch(IllegalAccessExceptione){
e.printStackTrace();
}
returnobj;
}
}
3.bean类Student.java:
importio.protostuff.Tag;
/**
*Createdbyzhangzhon2017/2/20.
*/
publicclassStudent{
@Tag(1)
privateStringname;
@Tag(2)
privateStringstudentNo;
@Tag(3)
privateintage;
@Tag(4)
privateStringschoolName;
//关于@Tag,要么所有属性都有@Tag注解,要么都没有,不能一个类中只有部分属性有@Tag注解
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
publicStringgetStudentNo(){
returnstudentNo;
}
publicvoidsetStudentNo(StringstudentNo){
this.studentNo=studentNo;
}
publicintgetAge(){
returnage;
}
publicvoidsetAge(intage){
this.age=age;
}
publicStringgetSchoolName(){
returnschoolName;
}
publicvoidsetSchoolName(StringschoolName){
this.schoolName=schoolName;
}
@Override
publicStringtoString(){
return"Student{"+
"name='"+name+'\''+
",studentNo='"+studentNo+'\''+
",age="+age+
",schoolName='"+schoolName+'\''+
'}';
}
}
3.test类ProtoBufUtilTest.java:
importjava.util.Arrays;
/**
*Createdbyzhangzhon2017/2/20.
*/
publicclassProtoBufUtilTest{
publicstaticvoidmain(String[]args){
Studentstudent=newStudent();
student.setName("lance");
student.setAge(28);
student.setStudentNo("2011070122");
student.setSchoolName("BJUT");
byte[]serializerResult=ProtoBufUtil.serializer(student);
System.out.println("serializerresult:"+Arrays.toString(serializerResult));
StudentdeSerializerResult=ProtoBufUtil.deserializer(serializerResult,Student.class);
System.out.println("deSerializerResult:"+deSerializerResult.toString());
}
}
4.输出结果:
serializerresult:[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'}
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对毛票票的支持。如果你想了解更多相关内容请查看下面相关链接