diff --git a/akka-kryo-serialization/src/main/scala/io/altoo/akka/serialization/kryo/DefaultKryoInitializer.scala b/akka-kryo-serialization/src/main/scala/io/altoo/akka/serialization/kryo/DefaultKryoInitializer.scala index 3f9ed8c..c1ad6ab 100644 --- a/akka-kryo-serialization/src/main/scala/io/altoo/akka/serialization/kryo/DefaultKryoInitializer.scala +++ b/akka-kryo-serialization/src/main/scala/io/altoo/akka/serialization/kryo/DefaultKryoInitializer.scala @@ -1,8 +1,9 @@ package io.altoo.akka.serialization.kryo import akka.actor.{ActorRef, ExtendedActorSystem} -import com.esotericsoftware.kryo.Serializer +import com.esotericsoftware.kryo.{ClassResolver, ReferenceResolver, Serializer} import com.esotericsoftware.kryo.serializers.FieldSerializer +import com.esotericsoftware.kryo.util.{DefaultClassResolver, ListReferenceResolver, MapReferenceResolver} import io.altoo.akka.serialization.kryo.serializer.akka.{ActorRefSerializer, ByteStringSerializer} import io.altoo.akka.serialization.kryo.serializer.scala._ @@ -13,6 +14,22 @@ import scala.util.{Failure, Success} */ class DefaultKryoInitializer { + /** + * Can be overridden to provide a custom reference resolver - override only if you know what you are doing! + */ + def createReferenceResolver(settings: KryoSerializationSettings): ReferenceResolver = { + if (settings.kryoReferenceMap) new MapReferenceResolver() else new ListReferenceResolver() + } + + /** + * Can be overridden to provide a custom class resolver - override only if you know what you are doing! + */ + def createClassResolver(settings: KryoSerializationSettings): ClassResolver = { + if (settings.idStrategy == "incremental") new KryoClassResolver(settings.implicitRegistrationLogging) + else if (settings.resolveSubclasses) new SubclassResolver() + else new DefaultClassResolver() + } + /** * Can be overridden to set a different field serializer before other serializer are initialized. * Note: register custom classes/serializer in `postInit`, otherwise default order might break. diff --git a/akka-kryo-serialization/src/main/scala/io/altoo/akka/serialization/kryo/KryoSerializer.scala b/akka-kryo-serialization/src/main/scala/io/altoo/akka/serialization/kryo/KryoSerializer.scala index 906738f..7bcb48e 100644 --- a/akka-kryo-serialization/src/main/scala/io/altoo/akka/serialization/kryo/KryoSerializer.scala +++ b/akka-kryo-serialization/src/main/scala/io/altoo/akka/serialization/kryo/KryoSerializer.scala @@ -32,13 +32,21 @@ import java.nio.ByteBuffer import scala.jdk.CollectionConverters._ import scala.util._ -private[kryo] class EncryptionSettings(val config: Config) { +/** + * INTERNAL API - api may change at any point in time + * without any warning. + */ +class EncryptionSettings(val config: Config) { val keyProvider: String = config.getString("encryption.aes.key-provider") val aesMode: String = config.getString("encryption.aes.mode") val aesIvLength: Int = config.getInt("encryption.aes.iv-length") } -private[kryo] class KryoSerializationSettings(val config: Config) { +/** + * INTERNAL API - api may change at any point in time + * without any warning. + */ +class KryoSerializationSettings(val config: Config) { val serializerType: String = config.getString("type") val bufferSize: Int = config.getInt("buffer-size") @@ -204,11 +212,11 @@ class KryoSerializer(val system: ExtendedActorSystem) extends Serializer with By } private def getKryo(strategy: String, serializerType: String): Kryo = { - val referenceResolver = if (settings.kryoReferenceMap) new MapReferenceResolver() else new ListReferenceResolver() - val classResolver = - if (settings.idStrategy == "incremental") new KryoClassResolver(settings.implicitRegistrationLogging) - else if (settings.resolveSubclasses) new SubclassResolver() - else new DefaultClassResolver() + val initializer = kryoInitializerClass.getDeclaredConstructor().newInstance() + + val referenceResolver = initializer.createReferenceResolver(settings) + val classResolver = initializer.createClassResolver(settings) + val kryo = new ScalaKryo(classResolver, referenceResolver) kryo.setClassLoader(system.dynamicAccess.classLoader) // support deserialization of classes without no-arg constructors @@ -223,8 +231,6 @@ class KryoSerializer(val system: ExtendedActorSystem) extends Serializer with By case o => throw new IllegalStateException("Unknown serializer type: " + o) } - val initializer = kryoInitializerClass.getDeclaredConstructor().newInstance() - // setting default serializer initializer.preInit(kryo, system) // akka byte string serializer must be registered before generic scala collection serializer