Kryo反序列化问题:枚举

时间:2015-11-20 14:35:07

标签: serialization enums kryo

我一直在研究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。我不确定究竟是什么导致了这个问题。

请你帮我解决这个问题。

1 个答案:

答案 0 :(得分:2)

上述问题是由于Kryo注册课程的方式。我想,您已使用kryo.register(Class)方法注册该类。

在几个月前将值序列化后,已经有一些新类已添加到kryo注册列表中。

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

此外,为了避免在将来添加新类时出现此问题,请为使用kryo.register(Class, int)方法注册的类提供显式ID。