altoo-ag/akka-kryo-serialization

Encountered unregistered class ID

vahid-01 opened this issue · 2 comments

Hi. I used play version 2.6.15 and akka-kryo-serialization version 0.5.2.
I got unregistered class ID randomly for all key type that stored in cache.
When this error occurred, I think the key cached again.
My configuration :


    kyro {
      idstrategy = "incremental"
      kryo-trace = false
      implicit-registration-logging = true
      enable-additional-serialization-bindings = true
      mappings {
        "entity.ConfigEntity" = 27,
         ...
      }
    }

    serializers {
      java = "akka.serialization.JavaSerializer"
      proto = "akka.remote.serialization.ProtobufSerializer"
      # Define kryo serializer
      kryo = "com.romix.akka.serialization.kryo.KryoSerializer"
    }

    serialization-bindings {
      "entity.ConfigEntity" = kryo
      ... 
    }

one example of error :

[[error]] 2018-06-30 T 14:56:00.540 thread:[ication-akka.actor.default-dispatcher-50] play.api.cache.redis.?@?:	Deserialization failed for key 'ConfigEntity@system/instances'. com.esotericsoftware.kryo.KryoException: Encountered unregistered class ID: 782369289
	at com.esotericsoftware.kryo.util.DefaultClassResolver.readClass(DefaultClassResolver.java:137)
	at com.esotericsoftware.kryo.Kryo.readClass(Kryo.java:693)
	at com.esotericsoftware.kryo.Kryo.readClassAndObject(Kryo.java:804)
	at com.romix.akka.serialization.kryo.KryoBasedSerializer.fromBinary(KryoSerializer.scala:504)
	at com.romix.akka.serialization.kryo.KryoSerializer.fromBinary(KryoSerializer.scala:351)
	at akka.serialization.Serialization.$anonfun$deserialize$3(Serialization.scala:212)
	at scala.util.Try$.apply(Try.scala:209)
	at akka.serialization.Serialization.deserialize(Serialization.scala:212)
	at play.api.cache.redis.connector.AkkaDecoder.binaryToAnyRef(AkkaSerializer.scala:124)
	at play.api.cache.redis.connector.AkkaDecoder.$anonfun$stringToAnyRef$2(AkkaSerializer.scala:128)
	at scala.Function1.$anonfun$andThen$1(Function1.scala:52)
	at play.api.cache.redis.connector.AkkaDecoder.stringToAnyRef(AkkaSerializer.scala:128)
	at play.api.cache.redis.connector.AkkaDecoder.untypedDecode(AkkaSerializer.scala:115)
	at play.api.cache.redis.connector.AkkaDecoder.decode(AkkaSerializer.scala:99)
	at play.api.cache.redis.connector.AkkaSerializerImpl.$anonfun$decode$1(AkkaSerializer.scala:165)

[[debug]] 2018-06-30 T 14:56:00.545 thread:[ication-akka.actor.default-dispatcher-29] play.api.cache.redis.?@?:	Set on key 'ConfigEntity@system/instances' for 1800 seconds. 
[[debug]] 2018-06-30 T 14:56:00.546 thread:[ication-akka.actor.default-dispatcher-37] play.api.cache.redis.?@?:	Set on key 'classTag::ConfigEntity@system/instances' for 1800 seconds. 

luben commented

If the cache is used by multiple JVMs the "incremental" strategy will not work as the order of use may be different, so different "incremental" ids will be assigned. Try with the "default" strategy or pre-register your classes.

Thanks for reply. The cache used only by one JVM. I thought mappings configuration register my classes and I didn't need pre-register class.