前言: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<T>*/public <T>T deserialize(byte[] bytes);/*** 反序列化* @param bytes* @param offset* @param count* @return*/public <T>T deserialize(byte[] bytes, int offset, int count);}

使用kryo实现上面的接口

/*** 基于kyro的序列化/反序列化工具* * @author eguid**/
public class kryoSerializer implements Serializer {// 由于kryo不是线程安全的,所以每个线程都使用独立的kryofinal ThreadLocal<Kryo> kryoLocal = new ThreadLocal<Kryo>() {@Overrideprotected Kryo initialValue() {Kryo kryo = new Kryo();kryo.register(ct, new BeanSerializer<>(kryo, ct));return kryo;}};final ThreadLocal<Output> outputLocal = new ThreadLocal<Output>();final ThreadLocal<Input> inputLocal = new ThreadLocal<Input>();private Class<?> ct = null;public kryoSerializer(Class<?> ct) {this.ct = ct;}public Class<?> getCt() {return ct;}public void setCt(Class<?> ct) {this.ct = ct;}@Overridepublic void serialize(Object obj, byte[] bytes) {Kryo kryo = getKryo();Output output = getOutput(bytes);kryo.writeObjectOrNull(output, obj, obj.getClass());output.flush();}@Overridepublic 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")@Overridepublic <T> T deserialize(byte[] bytes, int offset, int count) {Kryo kryo = getKryo();Input input = getInput(bytes, offset, count);return (T) kryo.readObjectOrNull(input, ct);}@Overridepublic <T> 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);}

----end----

转载于:https://www.cnblogs.com/eguid/p/10195569.html

高性能的序列化与反序列化:kryo的简单使用相关推荐

  1. 序列化和反序列化漏洞的简单理解

    1 背景 2015年11月6日,FoxGlove Security安全团队的@breenmachine 发布的一篇博客[3]中介绍了如何利用Java反序列化漏洞,来攻击最新版的WebLogic.Web ...

  2. 【RPC】序列化与反序列化

    文章目录 1. 基本概念? 2. 文本格式的序列化方案 2.1 XML格式 2.2 JSON格式 3. 二进制格式的序列化方法 4. 序列化框架选型 1. 基本概念? 序列化和反序列化是一种数据转化的 ...

  3. XML的序列化和反序列化 详细介绍

    为什么要做序列化和反序列化? 一个回答: 我们都知道对象是不能在网络中直接传输的,不过还有补救的办法.XML(Extensible Markup Language)可扩展标记语言,本身就被设计用来存储 ...

  4. 使用LitJson进行序列化和反序列化

    这是第31篇与游戏开发有关的文章. | 写在最前 最近在写小玩具的时候,遇到了需要将游戏记录到本地.并从本地读取的情况,如:保存游戏战斗录像或是存储.读取游戏存档.有多种方法可以实现这个需求,在这里我 ...

  5. XmlSerializer 对象的Xml序列化和反序列化,XMLROOT别名设置

    这篇随笔对应的.Net命名空间是System.Xml.Serialization:文中的示例代码需要引用这个命名空间. 为什么要做序列化和反序列化? .Net程序执行时,对象都驻留在内存中:内存中的对 ...

  6. Java序列化与反序列化(一)

    目录 序列化与反序列化 1.最简单的使用:Serializable 接口 2. 序列化 ID 的问题 3. 静态字段不会序列化 4. 屏蔽字段:transient 5. 父类的序列化 6. 自定义序列 ...

  7. java 序列化工具kryo_java jackson avro kryo等几种序列化与反序列化工具的使用

    最近由于工作需要,需要研究常用的集中序列化方式,主要目的是对象序列化后占用空间会大大减少,便于存储和传输,下面是几种序列化方式的使用demo 1. Java自带的Serialize 依赖jar包:无 ...

  8. C#序列化与反序列化方式简单总结

    序列化和反序列化 相关类: System.SerializableAttribute特性(或称为属性), System.Runtime.Serialization.ISerializable(自定义序 ...

  9. (13)C#传智:访问修饰符,简单工厂模式,序列化与反序列化,部分类,密封类,接口(第13天)

    内容超级多,慢慢来... 深入BinaryFormatter 一.访问修饰符 public: 公共的,公开的     private:私有的,只能在当前类的内部访问     protected:受保持 ...

最新文章

  1. 人工智能能否跨越意识鸿沟?
  2. flutter doctor --android-licenses 报错解决方案
  3. 高响应比优先算法代码_以梦为码丨让每一行代码都充满温情
  4. 如何循序渐进有效学习 JavaScript?
  5. SDNU 1085.爬楼梯再加强版(矩阵快速幂)
  6. 将VC++6.0的代码迁移到VS2005常见问题总结(Window核心编程第五版以前代码在VS2005无法编译的解决方案)...
  7. Flex学习笔记(2)——使用ActionScript脚本
  8. futuretask java 并发请求_Java并发案例04---Future和 FutureTask
  9. scrapy.response
  10. 计算文件大小与文件行数
  11. QString::section
  12. Python地理地图可视化:plotly连接mapbox多个地理经纬度中心点line+marker
  13. 这是一个价值一个亿的项目思维导图
  14. 在OPENSTACK中 WIN7和WIN2008 R2实例启动时蓝屏报 STOP:0X0000005DT
  15. Mobius反演(莫比乌斯反演)
  16. 【绘图杂记16】Echarts 热力矩阵图
  17. 安卓恢复大师怎样恢复手机删除的照片
  18. php js 插件,超轻量级网页流布局JS插件Macy.js
  19. 粤有料|南沙大桥正式通车,“快到飞起”的粤港澳大湾区在!路!上!
  20. 计算机常见故障以及维修方法

热门文章

  1. BugkuCTF-reverse:入门逆向
  2. 设计模式-静态工厂之服务提供者框架
  3. Hi3516A开发--内存换算
  4. zcmu2012(积性函数---因子和)
  5. Java-gt;Android并发编程引气入门篇
  6. dvd清洗碟效果好吗_用什么清洗抽油烟机效果比较好?有哪些注意事项?
  7. JZOJ 5286. 【NOIP2017提高A组模拟8.16】花花的森林
  8. Qt WebSocket服务端的简单Demo
  9. Surface Computing
  10. Visual BERT论文的简单汇总