写在前面

本文隶属于专栏《100个问题搞定大数据理论体系》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!

本专栏目录结构和文献引用请见100个问题搞定大数据理论体系

解答

Kryo是一个快速且高效的针对Java对象序列化的框架。

补充

优点

  1. 序列化的性能非常高
  2. 序列化结果体积较小
  3. 提供了简单易用的API
  4. Kryo序列化被很多开源项目使用,社区非常活跃,版本迭代也比较快。

缺点

  1. 不支持跨语言——Kryo是针对Java Object的序列化,对于跨语言方面是不支持的,但是很多场景中比如RPC,Cache,Store场景中一般很少需要对跨语言的支持。因此,Kryo的适用场景也很不错。
  2. 使用Kryo要注册需要序列化的自定义类型,如果不注册需要序列化的自定义类型,Kryo也能工作,不过,每个对象实例的序列化结果都会包含一份完整的类名,这有点浪费空间。

为什么使用kryo?

因为性能足够好。

比kryo更高效的序列化库就只有google的protobuf了(而且两者性能很接近)

protobuf有个缺点就是要传输的每一个类的结构都要生成对应的proto文件(也可以都放在同一个proto文件中,如果考虑到扩展性的话,不建议放在一个proto文件中),如果某个类发生修改,还得重新生成该类对应的proto文件;另外考虑到项目中用的全部是java技术栈,不存在不同编程语言间的兼容性问题,因此最终采用了kryo作为序列化库。

使用场景

数据交换或数据持久化

比如使用kryo把对象序列化成字节数组发送给消息队列或者放到redis等nosql中等等应用场景。

使用注意

由于kryo不是线程安全的,针对多线程情况下的使用,要对kryo进行一个简单的封装设计,从而可以多线程安全的使用序列化和反序列化。

Q.E.D.


大数据开发工程师,精通 Spark,擅长 Java 和 Scala