Kryo 是啥
Kryo是Java生态中的一种序列化框架。许多软件组织在使用Dubbo(Dubbox)这套RPC框架时,经常会搭配使用 Kryo 作为其序列化方案。Kryo本身自带了很多针对 Java 原始数据类型 和 JDK常见类型的 序列化实现(如,DefaultSerializers)。它的姐妹工程 Kryo-Serializers 还提供很多额外的序列化实现。
序列化/反序列化的兼容性问题
序列化/反序列化 最主要的是关注对象内容。大多数场景中,我们只会序列化对象的内容,即各字段的值。而对象的类信息,它们属于元信息,是不会被序列化的。如果将这些元信息也加入到序列化内容中,会导致得到的结果数据非常大。尤其在RPC之类的网络传输中,这些数据会消耗大量资源。
那么,如果不传递这些元信息,数据的接收端怎么知道这些数据的类型呢?这就需要事先在接收端也准备好一份对应的类型信息(通常是一个JAR包)。(某些场景中将这类事先分发的元信息称为“字典”。有点类似战争中分发的密码本。)
这又引出了另一个问题:发送端 和 接收端 的类型信息(JAR包)版本可能不一致;这种不一致很可能导致接收端反序列化失败。尤其是在大型的复杂软件体系中,发送端 和 接收端 的升级节奏可能不一样的,很多时候需要容忍有较长时间的不同版本同时运行。(战争中密码本会定期更新;遇到密码本泄漏或密码被敌军破译的情况时,还需紧急更新。)
此文中讨论的 “兼容性” 仅表示数据本身的序列化和反序列化。业务层面的兼容性当然得由业务系统的设计者自行考量。
为了达成序列化/反序列化的的“兼容性”,最关键的是要“跳过”那些无法被识别的字段。如何才能实现这个“跳过”呢?显然,需要鉴别