serialization of ActorRef, #21202

This commit is contained in:
Patrik Nordwall 2016-09-27 15:46:22 +02:00
parent e61ffd1132
commit be319afcd2
3 changed files with 16 additions and 1 deletions

View file

@ -65,6 +65,8 @@ akka {
"akka.actor.InvalidActorNameException" = akka-misc
"akka.actor.InvalidMessageException" = akka-misc
"akka.actor.ActorRef" = akka-misc
}
serialization-identifiers {

View file

@ -21,6 +21,7 @@ class MiscMessageSerializer(val system: ExtendedActorSystem) extends SerializerW
case identity: ActorIdentity serializeActorIdentity(identity)
case Some(value) serializeSome(value)
case None NoneSerialized
case r: ActorRef serializeActorRef(r)
case s: Status.Success serializeStatusSuccess(s)
case f: Status.Failure serializeStatusFailure(f)
case t: Throwable throwableSupport.serializeThrowable(t)
@ -53,6 +54,9 @@ class MiscMessageSerializer(val system: ExtendedActorSystem) extends SerializerW
.build()
.toByteArray
private def serializeActorRef(ref: ActorRef): Array[Byte] =
actorRefBuilder(ref).build().toByteArray
private def actorRefBuilder(actorRef: ActorRef): ContainerFormats.ActorRef.Builder =
ContainerFormats.ActorRef.newBuilder()
.setPath(Serialization.serializedActorPath(actorRef))
@ -69,6 +73,7 @@ class MiscMessageSerializer(val system: ExtendedActorSystem) extends SerializerW
private val StatusSuccessManifest = "D"
private val StatusFailureManifest = "E"
private val ThrowableManifest = "F"
private val ActorRefManifest = "G"
private val fromBinaryMap = Map[String, Array[Byte] AnyRef](
IdentifyManifest deserializeIdentify,
@ -76,13 +81,15 @@ class MiscMessageSerializer(val system: ExtendedActorSystem) extends SerializerW
OptionManifest deserializeOption,
StatusSuccessManifest deserializeStatusSuccess,
StatusFailureManifest deserializeStatusFailure,
ThrowableManifest throwableSupport.deserializeThrowable)
ThrowableManifest throwableSupport.deserializeThrowable,
ActorRefManifest deserializeActorRefBytes)
override def manifest(o: AnyRef): String =
o match {
case _: Identify IdentifyManifest
case _: ActorIdentity ActorIdentifyManifest
case _: Option[Any] OptionManifest
case _: ActorRef ActorRefManifest
case _: Status.Success StatusSuccessManifest
case _: Status.Failure StatusFailureManifest
case _: Throwable ThrowableManifest
@ -114,6 +121,9 @@ class MiscMessageSerializer(val system: ExtendedActorSystem) extends SerializerW
ActorIdentity(correlationId, actorRef)
}
private def deserializeActorRefBytes(bytes: Array[Byte]): ActorRef =
deserializeActorRef(ContainerFormats.ActorRef.parseFrom(bytes))
private def deserializeActorRef(actorRef: ContainerFormats.ActorRef): ActorRef =
serialization.system.provider.resolveActorRef(actorRef.getPath)

View file

@ -58,6 +58,8 @@ object MiscMessageSerializerSpec {
class MiscMessageSerializerSpec extends AkkaSpec(MiscMessageSerializerSpec.testConfig) {
import MiscMessageSerializerSpec._
val ref = system.actorOf(Props.empty, "hello")
"MiscMessageSerializer" must {
Seq(
"Identify" Identify("some-message"),
@ -71,6 +73,7 @@ class MiscMessageSerializerSpec extends AkkaSpec(MiscMessageSerializerSpec.testC
"Status.Success" Status.Success("value"),
"Status.Failure" Status.Failure(new TestException("err")),
"Status.Failure JavaSer" Status.Failure(new OtherException("exc")), // exc with JavaSerializer
"ActorRef" ref,
"Some" Some("value"),
"None" None).foreach {
case (scenario, item)