Kryo是一个快速高效的Java序列化框架,旨在提供快速、高效和易用的API。无论文件、数据库或网络数据Kryo都可以随时完成序列化。Kryo还可以执行自动深拷贝(克隆)、浅拷贝(克隆)。这是对象到对象的直接拷贝,非对象->字节->对象的拷贝。性能较其它有一定的优质。具体参数可参考引用的第三篇文章。
maven中 通过如下 ,最新版为 4.0.
com.esotericsoftware kryo 4.0.0
两个优化配置:
类注册:将需要序列化的类注册到kryo中,可以提高序列化与反序列化的速度。
Reference:开启这个选项后,相同的对象将被序列化为同一个byte[],默认关闭,如果要支持循环引用,则必须开启。
示例
1)文件流序列化对象
Kryo kryo = new Kryo();// ...Output output = new Output(new FileOutputStream("file.bin"));SomeClass someObject = ...kryo.writeObject(output, someObject);output.close();// ...Input input = new Input(new FileInputStream("file.bin"));SomeClass someObject = kryo.readObject(input, SomeClass.class);input.close();
2) 字节序列化对象
public byte[] Serialize(Object object) { Output output = null; output = new Output(1, 4096); //1 表示后台字节数组的初始大小,4096表示数组可扩容的最大值。 kryo.writeObject(output, object); byte[] bb = output.toBytes(); output.flush(); return bb; } publict Deserialize(byte[] bb) { Input input = null; input = new Input(bb); t res = (t) kryo.readObject(input, TestClass.class); input.close(); return res; }
3) 类和对象的序列化
static { kryo.setRegistrationRequired(false); kryo.setMaxDepth(20); } public static byte[] serialize(Object obj) { ByteArrayOutputStream out = null; Output output = null; try { out = new ByteArrayOutputStream(); output = new Output(out, 1024); kryo.writeClassAndObject(output, obj); return output.toBytes(); } catch (Exception e) { throw new CacheException(e); } finally { if (null != out) { try { out.close(); out = null; } catch (IOException e) { } } if (null != output) { output.close(); output = null; } } } public static Object deserialize(byte[] bytes) { Input input = null; try { input = new Input(bytes, 0, 1024); return kryo.readClassAndObject(input); } catch (Exception e) { throw new CacheException(e); } finally { if (null != input) { input.close(); input = null; } } }
通过如上示例,我们发现,使用起来灰常简单,接着我们简单分析下其源码,发现其核心是通过 Registration 这个类来实现序列化,而该类是通过其变量 Serializer接口来实现不同类型的序列化,其kryo自身提供了很多Serilaizer,如BooleanSerializer、CharSerializer、FloatSerializer等基本类型,还有set ,list,map都有对应的serializer,默认有 FieldSerializer ,只序列化field 数据,而其对于大多数场景都是适用的,还有性能最差的 JavaSerializer 利用的java自带的ObjectInputStream 序列化机制。
http://hao.jobbole.com/kryo/
https://dangdangdotcom.github.io/dubbox/serialization.html
https://github.com/eishay/jvm-serializers/wiki
https://www.oschina.net/question/54100_91827
http://blog.csdn.net/hengyunabc/article/details/7764509