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

高性能的序列化与反序列化kryo的简单使用

  前言
  kryo是个高效的java序列化/反序列化库,目前Twitter、yahoo、Apache、strom等等在使用该技术,比如Apache的spark、hive等大数据领域用的较多。为什么使用kryo而不是其他?
  因为性能足够好。比kyro更高效的序列化库就只有google的protobuf了(而且两者性能很接近),protobuf有个缺点就是要传输的每一个类的结构都要生成对应的proto文件(也可以都放在同一个proto文件中,如果考虑到扩展性的话,不建议放在一个proto文件中),如果某个类发生修改,还得重新生成该类对应的proto文件;另外考虑到项目中用的全部是java技术栈,不存在不同编程语言间的兼容性问题,因此最终采用了kryo作为序列化库。使用场景
  (数据交换或数据持久化)比如使用kryo把对象序列化成字节数组发送给消息队列或者放到redis等nosql中等等应用场景。
  注意:由于kryo不是线程安全的,针对多线程情况下的使用,要对kryo进行一个简单的封装设计,从而可以多线程安全的使用序列化和反序列化序列化和反序列化接口设计/**  * 序列化工具(程序调用该接口来实现obj<->byte[]之间的序列化/反序列化)  * @author eguid  *  */ public interface Serializer{ 	 	/** 	 * 序列化 	 * @param t 	 * @param bytes 	 */ 	public void serialize(Object t,byte[] bytes); 	 	/** 	 * 序列化 	 * @param obj 	 * @param bytes 	 * @param offset 	 * @param count 	 */ 	public void serialize(Object obj, byte[] bytes, int offset, int count); 	 	/** 	 * 反序列化 	 * @param bytes -字节数组 	 * @return T 	 */ 	public T deserialize(byte[] bytes); 	   	/** 	 * 反序列化 	 * @param bytes 	 * @param offset 	 * @param count 	 * @return 	 */ 	public T deserialize(byte[] bytes, int offset, int count);   }使用kryo实现上面的接口/**  * 基于kyro的序列化/反序列化工具  *   * @author eguid  *  */ public class kryoSerializer implements Serializer {   	// 由于kryo不是线程安全的,所以每个线程都使用独立的kryo 	final ThreadLocal kryoLocal = new ThreadLocal() { 		@Override 		protected Kryo initialValue() { 			Kryo kryo = new Kryo(); 			kryo.register(ct, new BeanSerializer<>(kryo, ct)); 			return kryo; 		} 	}; 	final ThreadLocal outputLocal = new ThreadLocal(); 	final ThreadLocal inputLocal = new ThreadLocal(); 	private Class<?> ct = null;   	public kryoSerializer(Class<?> ct) { 		this.ct = ct; 	}   	public Class<?> getCt() { 		return ct; 	}   	public void setCt(Class<?> ct) { 		this.ct = ct; 	}   	@Override 	public void serialize(Object obj, byte[] bytes) { 		Kryo kryo = getKryo(); 		Output output = getOutput(bytes); 		kryo.writeObjectOrNull(output, obj, obj.getClass()); 		output.flush(); 	}   	@Override 	public void serialize(Object obj, byte[] bytes, int offset, int count) { 		Kryo kryo = getKryo(); 		Output output = getOutput(bytes, offset, count); 		kryo.writeObjectOrNull(output, obj, obj.getClass()); 		output.flush(); 	}   	/** 	 * 获取kryo 	 *  	 * @param t 	 * @return 	 */ 	private Kryo getKryo() { 		return kryoLocal.get(); 	}   	/** 	 * 获取Output并设置初始数组 	 *  	 * @param bytes 	 * @return 	 */ 	private Output getOutput(byte[] bytes) { 		Output output = null; 		if ((output = outputLocal.get()) == null) { 			output = new Output(); 			outputLocal.set(output); 		} 		if (bytes != null) { 			output.setBuffer(bytes); 		} 		return output; 	}   	/** 	 * 获取Output 	 *  	 * @param bytes 	 * @return 	 */ 	private Output getOutput(byte[] bytes, int offset, int count) { 		Output output = null; 		if ((output = outputLocal.get()) == null) { 			output = new Output(); 			outputLocal.set(output); 		} 		if (bytes != null) { 			output.writeBytes(bytes, offset, count); 		} 		return output; 	}   	/** 	 * 获取Input 	 *  	 * @param bytes 	 * @param offset 	 * @param count 	 * @return 	 */ 	private Input getInput(byte[] bytes, int offset, int count) { 		Input input = null; 		if ((input = inputLocal.get()) == null) { 			input = new Input(); 			inputLocal.set(input); 		} 		if (bytes != null) { 			input.setBuffer(bytes, offset, count); 		} 		return input; 	}   	@SuppressWarnings("unchecked") 	@Override 	public  T deserialize(byte[] bytes, int offset, int count) { 		Kryo kryo = getKryo(); 		Input input = getInput(bytes, offset, count); 		return (T) kryo.readObjectOrNull(input, ct); 	}   	@Override 	public  T deserialize(byte[] bytes) { 		return deserialize(bytes, 0, bytes.length); 	}测试一下kryo的序列化和反序列化
  为什么使用纳秒,而不用毫秒?与java原生的序列化反序列化要耗时几毫秒不同,kryo序列化和反序列化太快了,单个对象的序列化反序列化速度都在0.0x毫秒左右(如果电脑性能更好的话,会更快)Serializer ser = new kryoSerializer(Msg.class); 		for (int i = 0; i < 10; i++) {   			Msg msg = new Msg();   			msg.setVersion_flag(new byte[] { 1, 2, 3 }); 			msg.setCrc_code((short) 1); 			msg.setMsg_body(new byte[] { 123, 123, 123, 43, 42, 1, 12, 45, 57, 98 }); 			byte[] bytes = new byte[300]; 			long start = System.nanoTime(); 			ser.serialize(msg, bytes); 			System.err.println("序列化耗时:" + (System.nanoTime() - start)); 			System.out.println(msg); 			System.out.println(Arrays.toString(bytes));   			Msg newmsg = null; 			start = System.nanoTime(); 			newmsg = ser.deserialize(bytes); 			System.err.println("反序列化耗时:" + (System.nanoTime() - start)); 			System.out.println(newmsg); 		}
  作者:eguid_1
  链接:https://juejin.cn/post/6953556788062978079

最新警方调查证明都美竹不是女侠,但吴亦凡依然凉凉文大白大家好,我是大白,欢迎来到我的白话天下。昨天晚上开始,就有好多朋友专门加了我的微信,让继续聊聊吴亦凡的事。因为关于吴亦凡事件,第一阶段的警方调查结果出来了。虽说目前还没有直接如何看待各类医药教辅保健类广告占据百度等搜索引擎?曾经,互联网给人们的生产生活带来了极大方便,人们不知道的知识可在网上查找,想要有关疾病及病理原因也可在网上找得到,想为小孩找培训老师也立即可以找到。但现在,我们不少人发现,要在百度小孩读书有天赋吗儿子小学读书属于中下水平,在几兄弟小孩中,年节聚在一起,老是被重点教育,妻子听了不爽,儿子默不作声。几个玩得好的同学的同年级小孩,一考试就会问我儿子成绩,儿子倒是会说出成绩。作为父流量也有所有权?近期在很多营销文章里都会看到流量所有权这个名词,小如深入地了解了一下,发现它其实与私域流量的概念很相近。流量所有权可以理解为流量的主人,流量的最终掌握者。在传统广告营销盛行的年代,抖音的私域流量是什么?抖音严格来说属于一个开放的流量空间。抖音在刚开始运作的时候基本上没有私域流量。随着抖音功能的不断升级,群聊粉丝群的上线,抖音的私域流量才逐渐形成。抖音私域流量池的搭建,对于商家来说主播带货,已走到末路罗永浩还清了他的6亿债务,以主播为核心的直播时代也随之终结。直播行业正式进入新的阶段。过去的一年里,直播倍受品牌关注,它帮助很多企业渡过了疫情的寒冬,却也让不少企业死于它的暖阳下。燕窝事件之后,辛巴好像就再也站不起来了9月2日,有粉丝打开辛有志快手账号主页面发现,辛巴直播间又一次被封禁了!直播封禁说明显示,该用户将于9月8日解封,平台方就这一次封禁的原因,并未发出任何公告,但猜测与辛有志之前叫板热点解析从丰巢收费事件,看智能快递柜未来的发展近期,丰巢快递柜超时收费的时间炒得沸沸扬扬。自4月30日,丰巢宣布对非会员用户实行超时收费,快件免费存放12小时后,每12小时收取0。5元超时保管费,3元封顶。这一举动迅速引起了极医疗机器人,未来重要的医疗资源?医疗资源是指提供医疗服务和生产要素的总称,通常包括人员医疗费用医疗机构医疗床位医疗设施和装备知识信息和技能等。经过一次范围广,持续时间长的疫情冲击,很多人对医疗资源有了进一步认知,工业化社会的食品安全保障,智能操控检测设备,杜绝食品中毒现象民以食为天,食品安全自然也是重中之重。日常生活中,人们从市场上购买食品,如果没有突发食品安全新闻出来,大家都不会想到食品安全问题,且只要出现在超市货架上,我们普遍认为它是安全的。当10个损坏相机的技巧教你如何损坏一台相机好的设备千千万万种毁坏他们的办法基本相同想知道怎样能减少相机的寿命加快你更换相机的速度吗?今天给大家辛辛苦苦整理的这十个小技巧你可要记住喽1。自动对焦时拧对焦环在相机自动对焦模式下
11。98万起售,搭载插电式混合动力,油耗1。2L,带你看缤越PHEV考虑到使用成本,购车预算,多数消费者都会考虑购买小排量车型,这也是为什么有的车型会推出1。5L1。6L1。2T1。3T1。4T小排量车型的原因。如今市场在向新能源靠拢,不断攻克新的喵喵机电子单词卡便携轻巧,让碎片时间更高效如果天赋一样,是不是只要比别人更努力就能成功?答案几乎是肯定的,从小老师就告诉我们要善于利用碎片时间,别让时间自己溜走。鲁迅说我是把别人喝咖啡的时间都用在学习上了。利用碎片时间学习看了无数个入手就亏的家电后,我发现了它们存在的通病不知道从什么时候开始,原本实用又耐用的家用电器,忽然找不到了。取而代之的是各种花里胡哨的家电,让越来越多的人成为当代神农,尝遍百草。从小家电鼻祖破壁机到网红多功能锅,让我这个种草达提前看22日公告精选小米集团2021年经调整净利润同比增长69。5百润股份拟以2亿元至4亿元回购股份看公告,小e抢先报!小米集团2021年经调整净利润同比增长69。5小米集团2021年实现经调整净利润220。395亿元,同比增长69。5第四季度经调整净利润44。7亿元,同比增长3新诺基亚2600概念机4寸打孔屏配鸿蒙系统,诺基亚情怀还值钱吗你印象中的诺基亚手机长啥模样?是大板砖还是经典的开机界面,不管印象如何,都是我们青春里不可磨灭的记忆。而网上曝光一组新诺基亚2600概念设计图,不仅拥有4寸打孔屏,还配备蔡司双镜头用了这么久Linux,才知道这些概念Linux和UNIX中的文件系统是一个以为根的树状式文件结构,是Linux和UNIX中的根目录,同样它也是文件系统的起点。所有的文件和目录都位于路径下,包括我们经常听到的usret13pro升级15。4rc去年十一月买的,电池容量这几天变成99,买来的时候是15。02续航真的不错,后来升级过两次,三月份升级到15。4rc,口罩解锁很香,室内秒解,但是晚上出去在外面解锁率不高。每次升级砍不动了?拼多多不装了自互联网普及以来,各电商平台也迅速崛起,网购成为了我们生活的一部分。一开始我们的网购平台就是京东和苹果了,这期间当然也出现过一些小平台,但是在这两大电商巨头占据了绝大多数市场份额的打假315揭开超低价手机虚假宣传的面纱300块可以买到智能机吗?我抱着试一试的心态打开了拼多多竟然找到了非常多300元价位的智能手机,满屏幕夸张的渲染图,配合花里胡哨的文案,真的有人买吗?真的有人买,卖得最好的一款销量原来手机的蓝牙功能还有这些大用处,比wifi还要强大,不用浪费了说到手机蓝牙这个功能。虽然说他是手机的基础功能之一,相信还有很多人并不熟悉,他都能怎么用?用到哪里呢?以至于很多好用的功能都没有用上,那今天呢就给大家分享七个蓝牙实用的功能,以及使美国顶级武器平台曝光全球网民遭无差别攻击全球任意地区任意上网用户,随时处在美国无差别网络攻击风险之中,包括他的盟友。3月22日下午,360政企安全集团发布技术报告,首次完整披露了NSA(美国国家安全局)针对中国境内目标使