Jackson-based JSON and CBOR serialization capabilities for the Akka toolkit, enabling efficient serialization and deserialization of Akka messages and persistent events.
npx @tessl/cli install tessl/maven-com-typesafe-akka--akka-serialization-jackson@2.8.0Akka Serialization Jackson provides comprehensive Jackson-based JSON and CBOR serialization capabilities for the Akka toolkit. This library enables efficient serialization and deserialization of Akka messages, persistent events, and distributed data with built-in support for Akka-specific types, data migration, compression, and security features.
Maven Coordinates:
<dependency>
<groupId>com.typesafe.akka</groupId>
<artifactId>akka-serialization-jackson_2.13</artifactId>
<version>2.8.8</version>
</dependency>SBT:
libraryDependencies += "com.typesafe.akka" %% "akka-serialization-jackson" % "2.8.8"import akka.serialization.jackson.JacksonObjectMapperProvider
import akka.serialization.jackson.JacksonObjectMapperProviderSetup
import akka.serialization.jackson.JacksonObjectMapperFactory
import akka.serialization.jackson.JacksonMigration
import akka.serialization.jackson.AkkaJacksonModuleThe most common usage is through Akka's serialization configuration:
akka.actor.serialization-bindings {
"com.example.MyMessage" = jackson-json
"com.example.MyEvent" = jackson-cbor
}import akka.actor.ActorSystem
import akka.serialization.jackson.JacksonObjectMapperProvider
import com.fasterxml.jackson.dataformat.cbor.CBORFactory
val system = ActorSystem("MySystem")
val provider = JacksonObjectMapperProvider(system)
// Get ObjectMapper for JSON
val jsonMapper = provider.getOrCreate("jackson-json", None)
// Get ObjectMapper for CBOR
val cborMapper = provider.getOrCreate("jackson-cbor", Some(new CBORFactory()))import akka.actor.ActorSystem
import akka.actor.setup.ActorSystemSetup
import akka.serialization.jackson.{JacksonObjectMapperProviderSetup, JacksonObjectMapperFactory}
// Create custom factory
class MyObjectMapperFactory extends JacksonObjectMapperFactory {
// Override methods to customize ObjectMapper creation
}
val customFactory = new MyObjectMapperFactory()
val setup = JacksonObjectMapperProviderSetup(customFactory)
val actorSystemSetup = ActorSystemSetup(setup)
val system = ActorSystem("MySystem", actorSystemSetup)Akka Serialization Jackson follows a modular architecture designed for high-performance distributed systems:
JacksonJsonSerializer and JacksonCborSerializer handle the actual serialization workThe library integrates seamlessly with Akka's serialization extension and can be configured per-binding for fine-grained control over serialization behavior.
The following serializer classes are configured in Akka's actor system:
// Automatically configured serializers (internal API, configured via akka.actor.serializers)
class JacksonJsonSerializer(system: ExtendedActorSystem, bindingName: String) extends JacksonSerializer
class JacksonCborSerializer(system: ExtendedActorSystem, bindingName: String) extends JacksonSerializer
// Base serializer class
abstract class JacksonSerializer(system: ExtendedActorSystem, bindingName: String, objectMapper: ObjectMapper)
extends SerializerWithStringManifest {
def toBinary(obj: AnyRef): Array[Byte]
def fromBinary(bytes: Array[Byte], manifest: String): AnyRef
def manifest(obj: AnyRef): String
}Note: These serializers are typically not instantiated directly but configured through Akka's serialization bindings.
Centralized creation and configuration of Jackson ObjectMapper instances with support for multiple bindings and custom factories.
final class JacksonObjectMapperProvider(system: ExtendedActorSystem) extends Extension {
// Scala API
def getOrCreate(bindingName: String, jsonFactory: Option[JsonFactory]): ObjectMapper
def create(bindingName: String, jsonFactory: Option[JsonFactory]): ObjectMapper
// Java API
def getOrCreate(bindingName: String, jsonFactory: Optional[JsonFactory]): ObjectMapper
def create(bindingName: String, jsonFactory: Optional[JsonFactory]): ObjectMapper
}
object JacksonObjectMapperProvider extends ExtensionId[JacksonObjectMapperProvider] {
def get(system: ActorSystem): JacksonObjectMapperProvider
def get(system: ClassicActorSystemProvider): JacksonObjectMapperProvider
def configForBinding(bindingName: String, systemConfig: Config): Config
}Schema evolution support for handling changes to serialized data structures over time.
abstract class JacksonMigration {
def currentVersion: Int
def supportedForwardVersion: Int
def transform(fromVersion: Int, json: JsonNode): JsonNode
def transformClassName(fromVersion: Int, className: String): String
}Built-in serialization support for Akka-specific types including ActorRef, typed ActorRef, Address, FiniteDuration, and StreamRef.
class AkkaJacksonModule extends JacksonModule
with ActorRefModule with AddressModule with FiniteDurationModule
class AkkaTypedJacksonModule extends JacksonModule with TypedActorRefModule
class AkkaStreamJacksonModule extends JacksonModule with StreamRefModuleComprehensive configuration options for Jackson features, compression, security, and serialization behavior.
class JacksonObjectMapperFactory {
def newObjectMapper(bindingName: String, jsonFactory: JsonFactory): ObjectMapper
def overrideConfiguredModules(bindingName: String, modules: immutable.Seq[Module]): immutable.Seq[Module]
def overrideConfiguredSerializationFeatures(bindingName: String, features: immutable.Seq[(SerializationFeature, Boolean)]): immutable.Seq[(SerializationFeature, Boolean)]
def overrideConfiguredDeserializationFeatures(bindingName: String, features: immutable.Seq[(DeserializationFeature, Boolean)]): immutable.Seq[(DeserializationFeature, Boolean)]
def overrideConfiguredMapperFeatures(bindingName: String, features: immutable.Seq[(MapperFeature, Boolean)]): immutable.Seq[(MapperFeature, Boolean)]
// ... other feature override methods
}
final class JacksonObjectMapperProviderSetup(val factory: JacksonObjectMapperFactory) extends Setup
object JacksonObjectMapperProviderSetup {
def apply(factory: JacksonObjectMapperFactory): JacksonObjectMapperProviderSetup
def create(factory: JacksonObjectMapperFactory): JacksonObjectMapperProviderSetup // Java API
}