Manifest-less Jackson serializers, #28113 (#28299)

* This adds the ability to make Jackson serializers not output the class
  name in the manifest in cases where type information is stored in a more
  concise format in the JSON itself.

* documentation about rolling updates

* Ensure programatic bindings are search in Jackson serializer
This commit is contained in:
James Roper 2019-12-05 22:50:01 +11:00 committed by Patrik Nordwall
parent 89165badbb
commit eb64d05b8c
5 changed files with 202 additions and 16 deletions

View file

@ -478,6 +478,70 @@ class JacksonJsonSerializerSpec extends JacksonSerializerSpec("jackson-json") {
JacksonSerializer.isGZipped(bytes) should ===(false)
}
}
"JacksonJsonSerializer without type in manifest" should {
import ScalaTestMessages._
"deserialize messages using the serialization bindings" in withSystem(
"""
akka.actor {
serializers.animal = "akka.serialization.jackson.JacksonJsonSerializer"
serialization-identifiers.animal = 9091
serialization-bindings {
"akka.serialization.jackson.ScalaTestMessages$Animal" = animal
}
}
akka.serialization.jackson.animal.type-in-manifest = off
""") { sys =>
val msg = Elephant("Dumbo", 1)
val serializer = serializerFor(msg, sys)
serializer.manifest(msg) should ===("")
val bytes = serializer.toBinary(msg)
val deserialized = serializer.fromBinary(bytes, "")
deserialized should ===(msg)
}
"deserialize messages using the configured deserialization type" in withSystem(
"""
akka.actor {
serializers.animal = "akka.serialization.jackson.JacksonJsonSerializer"
serialization-identifiers.animal = 9091
serialization-bindings {
"akka.serialization.jackson.ScalaTestMessages$Elephant" = animal
"akka.serialization.jackson.ScalaTestMessages$Lion" = animal
}
}
akka.serialization.jackson.animal {
type-in-manifest = off
deserialization-type = "akka.serialization.jackson.ScalaTestMessages$Animal"
}
""") { sys =>
val msg = Elephant("Dumbo", 1)
val serializer = serializerFor(msg, sys)
serializer.manifest(msg) should ===("")
val bytes = serializer.toBinary(msg)
val deserialized = serializer.fromBinary(bytes, "")
deserialized should ===(msg)
}
"fail if multiple serialization bindings are declared with no deserialization type" in {
an[IllegalArgumentException] should be thrownBy {
withSystem("""
akka.actor {
serializers.animal = "akka.serialization.jackson.JacksonJsonSerializer"
serialization-identifiers.animal = 9091
serialization-bindings {
"akka.serialization.jackson.ScalaTestMessages$Elephant" = animal
"akka.serialization.jackson.ScalaTestMessages$Lion" = animal
}
}
akka.serialization.jackson.animal {
type-in-manifest = off
}
""")(sys => checkSerialization(Elephant("Dumbo", 1), sys))
}
}
}
}
abstract class JacksonSerializerSpec(serializerName: String)