Skip to content

Commit

Permalink
Merge pull request #296 from altoo-ag/portCustomizeResolvers
Browse files Browse the repository at this point in the history
Allows to customize ReferenceResolver and ClassResolver directly for …
  • Loading branch information
danischroeter committed Nov 9, 2023
2 parents 56a0b1e + c245ce4 commit 74d73a1
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 10 deletions.
Original file line number Diff line number Diff line change
@@ -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._

Expand All @@ -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.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand Down Expand Up @@ -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
Expand All @@ -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
Expand Down

0 comments on commit 74d73a1

Please sign in to comment.