Kryo序列化依赖于Java版本?

Kryo序列化依赖于Java版本?,java,serialization,kryo,Java,Serialization,Kryo,使用Kryo反序列化序列化对象(来自文件)时,我遇到以下异常: java.lang.ExceptionInInitializerError (...) Caused by: com.esotericsoftware.kryo.KryoException: (...) Serialization trace: (...) at com.esotericsoftware.kryo.serializers.ObjectField.read(ObjectField.java:125)

使用Kryo反序列化序列化对象(来自文件)时,我遇到以下异常:

java.lang.ExceptionInInitializerError
    (...)
Caused by: com.esotericsoftware.kryo.KryoException: (...)
Serialization trace: (...)
    at com.esotericsoftware.kryo.serializers.ObjectField.read(ObjectField.java:125)
    at com.esotericsoftware.kryo.serializers.FieldSerializer.read(FieldSerializer.java:528)
    at com.esotericsoftware.kryo.Kryo.readClassAndObject(Kryo.java:786)
    at com.esotericsoftware.kryo.serializers.MapSerializer.read(MapSerializer.java:143)
    at com.esotericsoftware.kryo.serializers.MapSerializer.read(MapSerializer.java:21)
    at com.esotericsoftware.kryo.Kryo.readObject(Kryo.java:682)
    (...)
Caused by: java.lang.IndexOutOfBoundsException: Index: 1582, Size: 2
    at java.util.ArrayList.rangeCheck(Unknown Source)
    at java.util.ArrayList.get(Unknown Source)
    at com.esotericsoftware.kryo.util.MapReferenceResolver.getReadObject(MapReferenceResolver.java:42)
    at com.esotericsoftware.kryo.Kryo.readReferenceOrNull(Kryo.java:830)
    at com.esotericsoftware.kryo.Kryo.readObjectOrNull(Kryo.java:753)
    at com.esotericsoftware.kryo.serializers.ObjectField.read(ObjectField.java:113)
    ... 27 more
我的假设是,在反序列化时,序列化格式没有被正确理解(即,它发生了变化)。 用于序列化和反序列化的Kryo版本是相同的。java版本在序列化时可能会有所不同:这是一种解释吗

如果不是的话,任何关于如何生成此类异常的提示都是非常受欢迎的

非常感谢,托马斯

更新:根据建议,这里是从文件反序列化的类

反序列化的主类是
HashMap
其中自定义类定义(子类和父类)为:

public类PreflopEhsVOExtended扩展了PreflopEhsVO{
私有int值=0;
公共同步的void addValue(PreflopEhsVO值){
如果(numbValues==0)this.valuesPerNumbOpp=values.valuesPerNumbOpp;
否则{
//加权平均

for(inti=0;iKryo在不同的jvm中通常是不稳定的,除非您非常小心如何注册类型

当Kryo遇到以前从未见过的类型时,它会增加一个计数器并将该类型注册为该值。它会在对象图中使用这些值作为该类型的别名(性能优化)。如果第二个JVM上的执行顺序略有不同(无论版本是否相同),然后Kryo将使用不同的别名类型的注册表。这将防止序列化的blob被反序列化

解决方法是在kryo中打开“严格”模式,并用显式ID手动注册类

  kryo.register(SomeClass.class, 1);
  kryo.register(AnotherClass.class, 2);
这将确保类在两个JVM上注册到相同的稳定ID。如果这样做,您应该能够获得稳定的跨JVM序列化


另一个可能的问题可能是类序列化前后字段的更改。处理更改字段的唯一实用方法是使用
TaggedFieldSerializer

,很难理解如何操作。您可以发布正在反序列化的类吗?当然-刚刚更新的postI与Kryo有相同的问题,即使没有升级我们已经切换到FST,与kryo相比,它非常稳定。你的kryo实例是什么样子的?你使用了哪个序列化程序?更多的代码会有所帮助。
  kryo.register(SomeClass.class, 1);
  kryo.register(AnotherClass.class, 2);