范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

关于如何使用Kryo完成序列化和反序列化

  基于kryo完成序列化和反序列化1. Kryo的使用
  Step01:定义mail类:package com.java.serializable;  import java.io.Serializable; import java.util.Date;  public class Mail implements Serializable{ private static final long serialVersionUID = 6599166688654530165L; private Integer id; private String title; private String content; private Date createdTime; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } public Date getCreatedTime() { return createdTime; } public void setCreatedTime(Date createdTime) { this.createdTime = createdTime; } @Override public String toString() { return "Mail [id=" + id + ", title=" + title + ", content=" + content + ", createdTime=" + createdTime + "]"; }  }
  Step02:添加依赖 com.esotericsoftware kryo 5.0.0-RC4 
  Step03:编写测试类package com.java.serializable; import java.util.Date;  import org.apache.tomcat.util.http.fileupload.ByteArrayOutputStream;  import com.esotericsoftware.kryo.Kryo; import com.esotericsoftware.kryo.io.Input; import com.esotericsoftware.kryo.io.Output; public class TestSerializable06 { public static void main(String[] args) { Mail m=new Mail(); m.setId(100); m.setTitle("test"); m.setContent("this is test content"); m.setCreatedTime(new Date()); //基于Kryo框架将对象序列化 Kryo kryo=new Kryo(); //将默认类的自动注册功能关闭(默认会将类全名序列化) kryo.setRegistrationRequired(false); //kryo.register(Mail.class); //kryo.register(Date.class); ByteArrayOutputStream bos=//内置可扩容数组 new ByteArrayOutputStream(); Output output=new Output(bos); kryo.writeObject(output, m); //写入null时会报错 output.close(); System.out.println("序列化ok"); //基于Kryo框架将对象反序列化 byte[] data=bos.toByteArray(); Input input=new Input(data); Mail m2=kryo.readObject(input,Mail.class); //读出null时会报错 input.close(); System.out.println(m2);  } }
  结果:序列化ok Mail [id=100, title=test, content=this is test content, createdTime=Mon Nov 11 14:15:35 CST 2019]2. 工具类
  可将如上序列化方法进行封装,写到序列化工具类中,例如:public class KryoSerializer { private static final ThreadLocal kryoLocal = ThreadLocal.withInitial(() -> { Kryo kryo = new Kryo(); kryo.setReferences(true);//检测循环依赖,默认值为true,避免版本变化显式设置 kryo.setRegistrationRequired(false);//默认值为true,避免版本变化显式设置 ((DefaultInstantiatorStrategy) kryo.getInstantiatorStrategy()) .setFallbackInstantiatorStrategy(new StdInstantiatorStrategy());//设定默认的实例化器 return kryo; }); public byte[] serialize(Object obj) { Kryo kryo = getKryo(); ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); Output output = new Output(byteArrayOutputStream); kryo.writeClassAndObject(output, obj); output.close(); return byteArrayOutputStream.toByteArray(); } public  T deserialize(byte[] bytes) { Kryo kryo = getKryo(); Input input = new Input(new ByteArrayInputStream(bytes)); return (T) kryo.readClassAndObject(input); } private Kryo getKryo() { return kryoLocal.get(); } }
  编写测试类:package com.java.serializable; import java.io.IOException; import java.util.Date; public class TestSerializable07 { public static void main(String[] args)throws IOException { Mail m=new Mail(); m.setId(100); m.setTitle("test"); m.setContent("this is test content"); m.setCreatedTime(new Date()); //基于Kryo框架将对象序列化 byte[] array= KryoSerializer.serializable(m); System.out.println("序列化OK,array.length="+array.length); //基于Kryo框架将对象反序列化 Mail m2= KryoSerializer.deserialization(array,Mail.class); System.out.println(m2); } }
  运行结果:序列化OK,array.length=49 Mail [id=100, title=test, content=this is test content, createdTime=Mon Nov 11 18:04:03 CST 2019]3. 两种读写方式
  根据是否写入class类型分为两种方式, 这里特别指出这里的的class指的是读写对象的class, 如果读写的是有嵌套类型对象,则不管采用哪种方式, 子类型class都会序列化.3.1 只写实例信息知道class且对象不为nullkryo.writeObject(output, someObject); // ... SomeClass someObject = kryo.readObject(input, SomeClass.class);知道class且对象可能为nullkryo.writeObjectOrNull(output, someObject); // ... SomeClass someObject = kryo.readObjectOrNull(input, SomeClass.class);3.2 同时写入class类型和实例信息(RPC场景)
  class未知且对象可能为null, 但这种场景, 会多占用空间. 这种方式是我们在RPC中应当使用的方式kryo.writeClassAndObject(output, object); // ... Object object = kryo.readClassAndObject(input); if (object instanceof SomeClass) { // ... }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来维护以保证其线程安全。private static final ThreadLocal kryos = new ThreadLocal() { protected Kryo initialValue() { Kryo kryo = new Kryo(); // configure kryo instance, customize settings return kryo; }; }; // Somewhere else, use Kryo Kryo k = kryos.get(); ...
  或者使用kryo提供的pool:public KryoPool newKryoPool() { return new KryoPool.Builder(() -> { final Kryo kryo = new Kryo(); kryo.setInstantiatorStrategy(new Kryo.DefaultInstantiatorStrategy( new StdInstantiatorStrategy())); return kryo; }).softReferences().build(); }

20款老古董操作系统你用过哪几款?想必大家都知道,现在市面上主流的电脑操作系统莫过于微软的windows和苹果的MacOS。而你们知道以前的操作系统是啥样的吗?可能大部分人只知道最老的windowsxp或windo俩孩子,一个天天玩贴纸一个很少玩,一年级后,2个方面差距很大大家好呀,我是文文爸!女儿依依从2岁开始,就疯狂地爱上了玩贴纸。作为宠女狂魔的文文爸,自然也是陪她天天玩。老婆总是吐槽,天天到处乱贴能学到什么啊?你看人家圆圆,从来不玩贴纸,都能背有人说梓不建议取名,这个字真的不吉利吗?每个人的名字都表达了长辈对自己的爱,好的名字对后代的成长和个性有积极的影响。因此,父母在给孩子取名时往往都非常小心谨慎。近几年来,梓字深受家长用于取名的青睐,有数据显示,梓字曾蝉联待得不开心就离开,贺希宁如果申请转会,辽篮和广东队都会抢着要如果不是沈梓捷耍大牌喷队友,上海队上个赛季估计就止步CBA四强外了。但凡看过深圳队上赛季比赛的球迷,估计都能看出来这支球队的潜力有多大,有顾全这种能力出众的经验丰富之人,也有贺希宁14家中国品牌入围2022年最具价值全球品牌当地时间6月15日,有着全球品牌界奥斯卡之称的凯度BrandZ最具价值全球品牌排行榜正式发布2022年榜单。在最新的最具价值全球品牌100强榜单中,中国有14个品牌入选,成为上榜企从亲民款到专业款,挑选电子阅读器主要看哪些参数?教你国产品牌如何挖到宝摘要容量尺寸分辨率选购电子阅读器主要看哪些参数?国产品牌有哪些值得买呢?从千元以下的亲民款,到5000元上下的专业款,近年来国产阅读器不断涌现。目前主流国产电子阅读器基本都采用了开75岁之后,还能做好这些事情,一般都会长寿前言在我们的生活当中,有些事情是正常的,有些事情是不正常的,每个人都有自己的活法,因此我们一定要明白老年之后,生活并不是那么简单,如果没有掌握正确,长发日子就会过得很艰难,所以该做卡地亚东京总部以大胆的红色碰撞香槟金的奢华空间法国珠宝商卡地亚是奢华和创新的代名词自1847年成立以来,这个杰出的品牌一直在追求创新和卓越设计的推动下推动珠宝制作的极限。引人注目的是,卡地亚的突破性精神不仅限于其珍贵的手工艺品娱乐圈这4对明星,不是恋人却更胜恋人,不在一起可惜了全世界都以为我们在一起,但是只有我们自己知道,我们没有。娱乐圈有那么几对明星,相伴多年,在彼此最需要的时候,可以为对方义无反顾,但却始终没有走到一起,成为不少粉丝的意难平,今天我们中国牙膏第一品牌击败好来佳洁士高露洁,市场份额达到23中国是世界第一大牙膏生产国消费国和出口国,去年市场整体销售额为339。8亿元,同比增长0。86。从销售渠道结构来看,仍然以线下为主,占比达75。96。下面我们就根据尼尔森零售研究报彩电寒冬之下,品牌加速分化,全球老三或将ampampquot换位ampampquot2022年即将过半,全球尚未真正从疫情走出,又遭遇了俄乌地缘冲突,全球超级通胀。美联储货币紧缩等诸多负向因素影响下,让全球彩电市场的整体需求进一步陷入衰退期。据行业知名数据机构群智
赚到了!爽快了!洛杉矶湖人通过交易拿下了2127的天才后卫NBA常规赛,湖人今日迎战鹈鹕,前者上场比赛不敌开拓者继续排在西部倒数第三位,后者则是险胜雷霆暂列西部第七位,此役詹姆斯复出,班巴解除禁赛迎来首秀,锡安和南斯伤停。最终,湖人120砍45分带队取胜!真核确立,篮网这赛季还有戏,杜欧离队不退反进最近几年篮网真是声势浩大,组建了哈登欧文杜兰特的三巨头,不过随着此次交易截止日欧文与杜兰特的先后离队,篮网的巨头之路最终也就走到头了,三个赛季以来,篮网的阵容足够豪华,但球队始终没真香系列机械硬盘每GB价格暴跌87,懂的都懂!一提到机械硬盘想必大家都很熟悉,它最主要的作用就是储存数据。大多数的用户都有这么一个习惯,就是喜欢把电脑的系统和一些常用的软件安装在固态硬盘上,这样电脑加载读取数据打开软件的速度会攻防演练攻防演练也称为护网行为,是针对全国范围的真实网络目标为对象的实战攻防活动,旨在发现暴露和解决安全问题,更是检验我国各大企事业单位部属机关的网络安全防护水平和应急处置能力。下列是我司93913游戏周报1月23日1月29日VR游戏动态盘点周报导读VR版太空狼人杀AmongUsVR销量突破百万,SchellGames发推庆祝半衰期2第一章即将登陆PCVR行尸走肉圣徒与罪人第二章将于3月登陆PSVR2及SteamMet在游戏必输的时候,有些人会选择投降?有些人会等对手打败自己?游戏我最有发言权的还是王者荣耀,毕竟是从上线就开始玩的老粉了,现在S30赛季这个节奏就是快节奏,就举一个例子来说,我拿耀刷野,和对面李白差不多的经济,都是6000多,但是李白掉了一你的年终奖有多少?(附实时更新匿名调查结果)劳碌的一年。文灰信鸽严锦彦大年过完,新的一年开始等等,劳碌了一整年的你,有拿到2022的年终奖么?年终奖就是公司的晴雨表。日子过好了,到了年尾,老板摆出好酒好菜地犒劳三军。这年终奖游戏推荐单机联机,已打入汉化不是所有人都能联机的,测试时候有些人出现问题,显示steamisnot,具体原因未知,解决不了,那就玩单机吧名称ReadyorNot类型动作,冒险,独立,抢先体王者荣耀越塔失败被队友喷!3个技巧,让你轻松成为塔见愁!hello,大家好,我是小棉袄。关注点赞,下次更新不迷路!防御塔,峡谷最常见的机关之一,但你可能不知道它暗藏了许多不为人知的细节。今天这期小棉袄就教你拆塔越塔最实用的三个技巧,包你WorldofPrandis进不去游戏连接不上服务器的解决办法WorldofPrandis普兰迪斯的世界推荐给这些玩家。如果玩家不喜欢量产型自动游戏。如果玩家喜欢PCMMORPG等免费游戏。如果玩家想参加游戏。如果玩家希望控制在移动时发动攻击ELNERUE登陆Steam像素风探索美丽废墟Crownbird制作发行的新游ELNERUE于1月30日今天登陆Steam发售,本作是一款2D像素风探索美丽废墟新游,支持中文。ELNERUESteam地址ELNERUE为一款以