【问题标题】:Kryo Deserialzation Issue : Invalid ordinal value for EnumKryo 反序列化问题:枚举的序数值无效
【发布时间】:2015-11-20 14:35:06
【问题描述】:

我一直在使用 Kryo 来序列化我的数据并将其保存在数据库中。后来我尝试再次获取序列化数据并尝试反序列化它。 尽管我序列化的大多数数据都能正确反序列化,但在某些情况下,我会得到以下异常 Trace for some data:

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

【问题讨论】:

    标签: serialization enums kryo


    【解决方案1】:

    上述问题是由于在 Kryo 中注册课程的方式造成的。我想,你已经使用kryo.register(Class) 方法来注册课程了。

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-15
      • 1970-01-01
      • 2016-10-16
      相关资源
      最近更新 更多