本文主要梳理Kryo序列化基本实现。重点剖析Kryo#writeClassAndObject、Kryo#readClassAndObject方法。
1、源码分析Kryo#writeClassAndObject
代码@1:开始序列化, 将dept自增,表示当前深度,因为在序列化一个对象时,该方法有可能会被递归调用,每递归调用增加1,一次调用结束后在finally字句中自减。
代码@2:如果对象为空,则调用writeClass(DefaultSerializers$ClassSerializer),序列化为空。
代码@3:如果对象不为空,首先序列化对象所属的Class实例,从这里可以看出,Kryo在序列化时,首先先序列化类型。
代码@4:如果references 为true(默认为true,可以序列化循环依赖),则调用writeReferenceOrNull序列化。
代码@5:如果references 为false,则调用write序列化,此时如果对象存在循环依赖,则会抛出 throw new KryoException(“Max depth exceeded: ” + depth)异常,如果object为基本类型,也将通过该方法完成值的序列化。
代码@6:完成序列化后,恢复相关数据。也就是说Kryo实例并不是线程安全的。
默认references 为true,表示支持循