关于如何使用Kryo完成序列化和反序列化
基于kryo完成序列化和反序列化1。Kryo的使用
Step01:定义mail类:packagecom。java。serializable;importjava。io。Serializable;importjava。util。Date;publicclassMailimplementsSerializable{privatestaticfinallongserialVersionUID6599166688654530165L;privateIntegerid;privateStringtitle;privateStringcontent;privateDatecreatedTime;publicIntegergetId(){returnid;}publicvoidsetId(Integerid){this。idid;}publicStringgetTitle(){returntitle;}publicvoidsetTitle(Stringtitle){this。titletitle;}publicStringgetContent(){returncontent;}publicvoidsetContent(Stringcontent){this。contentcontent;}publicDategetCreatedTime(){returncreatedTime;}publicvoidsetCreatedTime(DatecreatedTime){this。createdTimecreatedTime;}OverridepublicStringtoString(){returnMail〔idid,titletitle,contentcontent,createdTimecreatedTime〕;}}
Step02:添加依赖dependencygroupIdcom。esotericsoftwaregroupIdkryoartifactIdversion5。0。0RC4versiondependency
Step03:编写测试类packagecom。java。serializable;importjava。util。Date;importorg。apache。tomcat。util。http。fileupload。ByteArrayOutputStream;importcom。esotericsoftware。kryo。Kryo;importcom。esotericsoftware。kryo。io。Input;importcom。esotericsoftware。kryo。io。Output;publicclassTestSerializable06{publicstaticvoidmain(String〔〕args){MailmnewMail();m。setId(100);m。setTitle(test);m。setContent(thisistestcontent);m。setCreatedTime(newDate());基于Kryo框架将对象序列化KryokryonewKryo();将默认类的自动注册功能关闭(默认会将类全名序列化)kryo。setRegistrationRequired(false);kryo。register(Mail。class);kryo。register(Date。class);ByteArrayOutputStreambos内置可扩容数组newByteArrayOutputStream();OutputoutputnewOutput(bos);kryo。writeObject(output,m);写入null时会报错output。close();System。out。println(序列化ok);基于Kryo框架将对象反序列化byte〔〕databos。toByteArray();InputinputnewInput(data);Mailm2kryo。readObject(input,Mail。class);读出null时会报错input。close();System。out。println(m2);}}
结果:序列化okMail〔id100,titletest,contentthisistestcontent,createdTimeMonNov1114:15:35CST2019〕2。工具类
可将如上序列化方法进行封装,写到序列化工具类中,例如:publicclassKryoSerializer{privatestaticfinalThreadLocalKryokryoLocalThreadLocal。withInitial((){KryokryonewKryo();kryo。setReferences(true);检测循环依赖,默认值为true,避免版本变化显式设置kryo。setRegistrationRequired(false);默认值为true,避免版本变化显式设置((DefaultInstantiatorStrategy)kryo。getInstantiatorStrategy())。setFallbackInstantiatorStrategy(newStdInstantiatorStrategy());设定默认的实例化器returnkryo;});publicbyte〔〕serialize(Objectobj){KryokryogetKryo();ByteArrayOutputStreambyteArrayOutputStreamnewByteArrayOutputStream();OutputoutputnewOutput(byteArrayOutputStream);kryo。writeClassAndObject(output,obj);output。close();returnbyteArrayOutputStream。toByteArray();}publicTTdeserialize(byte〔〕bytes){KryokryogetKryo();InputinputnewInput(newByteArrayInputStream(bytes));return(T)kryo。readClassAndObject(input);}privateKryogetKryo(){returnkryoLocal。get();}}
编写测试类:packagecom。java。serializable;importjava。io。IOException;importjava。util。Date;publicclassTestSerializable07{publicstaticvoidmain(String〔〕args)throwsIOException{MailmnewMail();m。setId(100);m。setTitle(test);m。setContent(thisistestcontent);m。setCreatedTime(newDate());基于Kryo框架将对象序列化byte〔〕arrayKryoSerializer。serializable(m);System。out。println(序列化OK,array。lengtharray。length);基于Kryo框架将对象反序列化Mailm2KryoSerializer。deserialization(array,Mail。class);System。out。println(m2);}}
运行结果:序列化OK,array。length49Mail〔id100,titletest,contentthisistestcontent,createdTimeMonNov1118:04:03CST2019〕3。两种读写方式
根据是否写入class类型分为两种方式,这里特别指出这里的的class指的是读写对象的class,如果读写的是有嵌套类型对象,则不管采用哪种方式,子类型class都会序列化。3。1只写实例信息知道class且对象不为nullkryo。writeObject(output,someObject);。。。SomeClasssomeObjectkryo。readObject(input,SomeClass。class);知道class且对象可能为nullkryo。writeObjectOrNull(output,someObject);。。。SomeClasssomeObjectkryo。readObjectOrNull(input,SomeClass。class);3。2同时写入class类型和实例信息(RPC场景)
class未知且对象可能为null,但这种场景,会多占用空间。这种方式是我们在RPC中应当使用的方式kryo。writeClassAndObject(output,object);。。。Objectobjectkryo。readClassAndObject(input);if(objectinstanceofSomeClass){。。。}4。相关配置
register类注册
kryo支持通过类注册,注册会给每一个class一个int类型的Id相关联,这显然比类名称高效,但同时要求反序列化的时候的Id必须与序列化过程中一致。这意味着注册的顺序非常重要。kryo。register(SomeClassA。class);kryo。register(SomeClassB。class);
但是由于现实原因,同样的代码,同样的Class在不同的机器上注册编号任然不能保证一致,所以多机器部署时候反序列化可能会出现问题。
所以kryo默认会开启类注册(version:5。0。2),可以通过kryo。setRegistrationRequired(false)关闭,关闭后Kryo会根据类型去loadClass关联kryo。setRegistrationRequired(false);一般设置为false解决线程不安全
由于Kryo线程不安全,意味着每次序列化和反序列化时都需要实例化一次,或借助ThreadLocal来维护以保证其线程安全。privatestaticfinalThreadLocalKryokryosnewThreadLocalKryo(){protectedKryoinitialValue(){KryokryonewKryo();configurekryoinstance,customizesettingsreturnkryo;};};Somewhereelse,useKryoKryokkryos。get();。。。
或者使用kryo提供的pool:publicKryoPoolnewKryoPool(){returnnewKryoPool。Builder((){finalKryokryonewKryo();kryo。setInstantiatorStrategy(newKryo。DefaultInstantiatorStrategy(newStdInstantiatorStrategy()));returnkryo;})。softReferences()。build();}
中国居民平衡膳食宝塔中国居民膳食宝塔共分五层,包含我们每天应吃的主食种类。膳食宝塔各层位置和面积不同,这在一定程度上反应出各类食物在膳食中的地位和应占的比重。第一层是谷薯类食物,每人每天应该吃2504
青未了时光啊,你是否可以慢些走图文洳语编辑洳语人生天地之间,若白驹之过隙,忽然而已。时间总是过得飞快,在一眨眼一投足之间就如流水一般消失不见了。前些日子,法桐树上的叶子还是茂密繁多,彩衣飘飘,几阵秋风萧瑟,便已
中药狗脊狗脊,乍听起来以为是狗的脊背。但其实,狗脊是一种常用植物性中药,今聊聊。狗脊,始载于神农本草经,又名百枝。苏恭根长多歧,状如狗之脊骨故以名之。又名强膂扶筋,时珍谓以功名也。尚有狗青
不帮阿根廷!英媒梅西和沙特达成协议,帮助其申办2030年世界杯北京时间11月22日,英媒的消息,梅西已经与沙特足协达成协议,帮助他们申办2030年世界杯。沙特是联合非洲的埃及和欧洲希腊一起申办,如果成功,将成为第一届欧亚非世界杯比赛。与此同时
卡塔尔王子帅到我了!穿白袍络腮胡尽显男人魅力,小贝都被比下去随着世界杯的开幕,举办地卡塔尔也成功走入全球球迷的视线中,关于卡塔尔的各种新闻层出不穷,不管是在开幕仪式上惊艳亮相的卡塔尔太后,还是看球,被做成表情包的卡塔尔王子都成功火出圈,引来
47岁小贝遇到对手,与卡塔尔王子同框输了卡塔尔世界杯正如火如荼进行中,除了耳熟能详的梅西C罗和内马尔等人,还有一些熟悉的面孔,比如贝克汉姆。卡塔尔世界杯请贝克汉姆做代言人,10年长约,1。5亿英镑,约8亿人民币,但对中东
沙特门将奥韦斯身价仅70万欧,却挡住了世界第3阿根廷22日,2022卡塔尔世界杯迎来第一个大冷门,世界第3阿根廷队出师不利,12负于国际排名比自己低48位的沙特阿拉伯队。沙特队除了下半场用闪电战打入两球惊讶世界外,他们的门将穆罕默德
德国队VS日本队德国国家队历史上5次参加世界杯比赛没有净胜对手1球或以上数据,在世界杯历史上,过去9场比赛,有6场上半场零封对手,球队上一次在世界杯历史上保持不败(2002年)还要追溯到1984年
不要脸?皮蓬前妻与乔丹儿子约会被骂,48岁超模穿透视裤用力过猛皮蓬前妻拉尔萨与乔丹二儿子马库斯乔丹约会,两人一起去看了NFL洛杉矶闪电队比赛。让拉尔萨没有想到的是,在观看比赛之时,她竟然被一位球迷劈头盖脸一通怒骂。该球迷质问拉尔萨在干什么,为
冷门推荐,丹麦神话再上演两日连红继续推荐丹麦队在经历了去年欧洲杯埃里克森的心脏骤停之后,重新强势回归世界杯赛场,作为场上的绝对英雄,埃里克森身边缺少了温德,达姆斯高这样的助力。整体实力上受到了一定的影响。但从技战术角度讲
世界杯伊朗队拒唱国歌!对于女性权益的维护从未停止11月21日晚,世界杯小组赛首轮B组比赛中,英格兰队对战伊朗队。赛前双方唱国歌环节,伊朗队全队拒绝唱国歌,保持沉默,以此表达他们支持国内女性争取自由不戴头巾的权利。此前,伊朗梅西前