We are using Kryo 2.24.0. We want to create a Kryo instance per thread using ThreadLocal recommended in the github site, but it had lots of exceptions when serialization, Is ThreadLocal instance supported in 2.24.0, currently we can't upgrade to 3.0.x, because it is not back compatible with data serialized using 2.24.0. The deserialization works fine without using ThreadLocal. Thanks in advance for any help on this!
private static final ThreadLocal<Kryo> kryos = new ThreadLocal<Kryo>() {
protected Kryo initialValue() {
return createSerializer();
};
};
private static Kryo createSerializer()
{
Kryo kryo = new Kryo();
kryo.register(xxx.class);
kryo.register(yyy.class);
// more reigsters
return kryo;
}
java.lang.ArrayIndexOutOfBoundsException: 113
at com.esotericsoftware.kryo.util.IdentityObjectIntMap.put(IdentityObjectIntMap.java:81)
at com.esotericsoftware.kryo.util.MapReferenceResolver.addWrittenObject(MapReferenceResolver.java:23)
at com.esotericsoftware.kryo.Kryo.writeReferenceOrNull(Kryo.java:629)
at com.esotericsoftware.kryo.Kryo.writeObject(Kryo.java:500)
java.lang.ArrayIndexOutOfBoundsException: 274
at com.esotericsoftware.kryo.util.IdentityObjectIntMap.get(IdentityObjectIntMap.java:247)
at com.esotericsoftware.kryo.util.MapReferenceResolver.getWrittenId(MapReferenceResolver.java:28)
at com.esotericsoftware.kryo.Kryo.writeReferenceOrNull(Kryo.java:619)
at com.esotericsoftware.kryo.Kryo.writeObject(Kryo.java:500)
com.esotericsoftware.kryo.KryoException: java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Float
Serialization trace:
Map (com.ebay.traffic.targetengine.Utilties$DatedLCScoreMap)
at com.esotericsoftware.kryo.serializers.ObjectField.write(ObjectField.java:82)
at com.esotericsoftware.kryo.serializers.FieldSerializer.write(FieldSerializer.java:495)
at com.esotericsoftware.kryo.Kryo.writeObject(Kryo.java:505)