我一直在研究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。我不确定究竟是什么导致了这个问题。
请你帮我解决这个问题。
答案 0 :(得分:2)
上述问题是由于Kryo注册课程的方式。我想,您已使用kryo.register(Class)
方法注册该类。
在几个月前将值序列化后,已经有一些新类已添加到kryo注册列表中。
您可以通过从注册中删除新添加的类来测试流程。
此外,为了避免在将来添加新类时出现此问题,请为使用kryo.register(Class, int)
方法注册的类提供显式ID。