博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JAVA序列化 框架 Kryo
阅读量:6655 次
发布时间:2019-06-25

本文共 2929 字,大约阅读时间需要 9 分钟。

hot3.png

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;	}	public 
t 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

转载于:https://my.oschina.net/ovirtKg/blog/783875

你可能感兴趣的文章
HDU 1872:稳定排序
查看>>
MFCchuangkou shanshuo
查看>>
莎莎的简历
查看>>
idea使用maven-archetype-webapp创建多模块项目无java文件夹和resources文件夹
查看>>
ES3之变量提升 ( hoisting )
查看>>
CSS 清除浮动
查看>>
BZOJ 3043
查看>>
JAVA第二次试验
查看>>
IE8下PNG图片格式显示不了问题
查看>>
MVC查询数据接收及校验
查看>>
快速排序(递归与非递归形式)
查看>>
【2016.3.19】作业 分析一个很有(wu)趣(liao)的小程序
查看>>
Codeforces 492E Vanya and Field
查看>>
01 超级搜索术——信息搜索:全面、快速查找全网你想要的任何信息、情报
查看>>
第183天:引用类型和值类型
查看>>
【Redis安装】部署与基本配置 --基于Mac和Linux
查看>>
Silverlight-遍历本地文件夹
查看>>
网络编程
查看>>
TCP和UDP协议的区别
查看>>
小游戏一:win32贴图——TransparentBlt
查看>>