写在前面
本文隶属于专栏《100个问题搞定大数据理论体系》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!
本专栏目录结构和文献引用请见100个问题搞定大数据理论体系
解答
Kryo是一个快速且高效的针对Java对象序列化的框架。
补充
优点
- 序列化的性能非常高
- 序列化结果体积较小
- 提供了简单易用的API
- Kryo序列化被很多开源项目使用,社区非常活跃,版本迭代也比较快。
缺点
- 不支持跨语言——Kryo是针对Java Object的序列化,对于跨语言方面是不支持的,但是很多场景中比如RPC,Cache,Store场景中一般很少需要对跨语言的支持。因此,Kryo的适用场景也很不错。
- 使用Kryo要注册需要序列化的自定义类型,如果不注册需要序列化的自定义类型,Kryo也能工作,不过,每个对象实例的序列化结果都会包含一份完整的类名,这有点浪费空间。
为什么使用kryo?
因为性能足够好。
比kryo更高效的序列化库就只有google的protobuf了(而且两者性能很接近)
protobuf有个缺点就是要传输的每一个类的结构都要生成对应的proto文件(也可以都放在同一个proto文件中,如果考虑到扩展性的话,不建议放在一个proto文件中),如果某个类发生修改,还得重新生成该类对应的proto文件;另外考虑到项目中用的全部是java技术栈,不存在不同编程语言间的兼容性问题,因此最终采用了kryo作为序列化库。
使用场景
数据交换或数据持久化
比如使用kryo把对象序列化成字节数组发送给消息队列或者放到redis等nosql中等等应用场景。
使用注意
由于kryo不是线程安全的,针对多线程情况下的使用,要对kryo进行一个简单的封装设计,从而可以多线程安全的使用序列化和反序列化。