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)); } publicstatic Tdeserializer(byte[]bytes,Class clazz){ 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'}
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对毛票票的支持。如果你想了解更多相关内容请查看下面相关链接