in serialization-jackson/src/main/scala/org/apache/pekko/serialization/jackson/JacksonSerializer.scala [320:392]
override def fromBinary(bytes: Array[Byte], manifest: String): AnyRef = {
checkAllowedSerializationBindings()
val startTime = if (isDebugEnabled) System.nanoTime else 0L
val (fromVersion, manifestClassName) = parseManifest(manifest)
if (typeInManifest) checkAllowedClassName(manifestClassName)
val migration = migrations.get(deserializationType.fold(manifestClassName)(_.getName))
val className = migration match {
case Some(transformer) if fromVersion < transformer.currentVersion =>
transformer.transformClassName(fromVersion, manifestClassName)
case Some(transformer) if fromVersion == transformer.currentVersion =>
manifestClassName
case Some(transformer) if fromVersion <= transformer.supportedForwardVersion =>
transformer.transformClassName(fromVersion, manifestClassName)
case Some(transformer) if fromVersion > transformer.supportedForwardVersion =>
throw new IllegalStateException(
s"Migration version ${transformer.supportedForwardVersion} is " +
s"behind version $fromVersion of deserialized type [$manifestClassName]")
case _ =>
manifestClassName
}
if (typeInManifest && (className ne manifestClassName))
checkAllowedClassName(className)
if (isCaseObject(className)) {
val result = system.dynamicAccess.getObjectFor[AnyRef](className) match {
case Success(obj) => obj
case Failure(_) =>
throw new NotSerializableException(
s"Cannot find manifest case object [$className] for serializer [${getClass.getName}].")
}
val clazz = result.getClass
checkAllowedClass(clazz)
// no migrations for case objects, since no json tree
logFromBinaryDuration(bytes, bytes, startTime, clazz)
result
} else {
val clazz = deserializationType.getOrElse {
system.dynamicAccess.getClassFor[AnyRef](className) match {
case Success(c) => c
case Failure(_) =>
throw new NotSerializableException(
s"Cannot find manifest class [$className] for serializer [${getClass.getName}].")
}
}
if (typeInManifest) checkAllowedClass(clazz)
val decompressedBytes = decompress(bytes)
val result = migration match {
case Some(transformer) if fromVersion < transformer.currentVersion =>
val jsonTree = objectMapper.readTree(decompressedBytes)
val newJsonTree = transformer.transform(fromVersion, jsonTree)
objectMapper.treeToValue(newJsonTree, clazz)
case Some(transformer) if fromVersion == transformer.currentVersion =>
objectMapper.readValue(decompressedBytes, clazz)
case Some(transformer) if fromVersion <= transformer.supportedForwardVersion =>
val jsonTree = objectMapper.readTree(decompressedBytes)
val newJsonTree = transformer.transform(fromVersion, jsonTree)
objectMapper.treeToValue(newJsonTree, clazz)
case _ =>
objectMapper.readValue(decompressedBytes, clazz)
}
logFromBinaryDuration(bytes, decompressedBytes, startTime, clazz)
result
}
}