Kryo 反序列化问题:枚举的序号无效

Kryo Deserialzation Issue : Invalid ordinal value for Enum

我一直在使用 Kryo 来序列化我的数据并将其保存在数据库中。稍后我尝试再次获取序列化数据并尝试反序列化它。 尽管我序列化的大部分数据都正确地反序列化了,但在某些情况下,我会得到以下某些数据的异常跟踪:

com.esotericsoftware.kryo.KryoException: Invalid ordinal for enum "test.swift.mt564.Code4Ec335Type": 29
Serialization trace:
dataMap (parser.container.TestDataCommon)
        at com.esotericsoftware.kryo.serializers.DefaultSerializers$EnumSerializer.read(DefaultSerializers.java:331)
        at com.esotericsoftware.kryo.serializers.DefaultSerializers$EnumSerializer.read(DefaultSerializers.java:305)
        at com.esotericsoftware.kryo.Kryo.readClassAndObject(Kryo.java:767)
        at com.esotericsoftware.kryo.serializers.MapSerializer.read(MapSerializer.java:139)
        at com.esotericsoftware.kryo.serializers.MapSerializer.read(MapSerializer.java:17)
        at com.esotericsoftware.kryo.Kryo.readObject(Kryo.java:685)
        at com.esotericsoftware.kryo.serializers.ObjectField.read(ObjectField.java:106)
        at com.esotericsoftware.kryo.serializers.FieldSerializer.read(FieldSerializer.java:482)
        at com.esotericsoftware.kryo.Kryo.readClassAndObject(Kryo.java:767)
        at java.lang.Thread.run(Thread.java:745)

几个月前,此数据已序列化并作为 BLOB 保存在数据库中。现在我发现需要检索此数据并将其反序列化。当我尝试将数据反序列化为所需的对象时出现上述异常。

我知道在反序列化 Enum 时,Kryo 使用 Enum 的序数值。但由于某种原因,它的序数值非常高,达到 30。我不确定究竟是什么导致了这个问题。

以上问题是由于 classes 在 Kryo 注册的方式造成的。我认为,您已经使用 kryo.register(Class) 方法注册了 class.

有一些新的 class 在价值几个月前被序列化后被添加到 kryo 注册列表中。

您可以通过从注册中删除新添加的 class 来验证以测试流程。

另外,为了在将来添加新的 classes 时避免此问题,请为正在使用 kryo.register(Class, int) 方法注册的 classes 提供一个明确的 ID。