diff --git a/akka-remote/src/main/resources/reference.conf b/akka-remote/src/main/resources/reference.conf index c28ee7ae2c..3692405d55 100644 --- a/akka-remote/src/main/resources/reference.conf +++ b/akka-remote/src/main/resources/reference.conf @@ -65,6 +65,8 @@ akka { "akka.actor.InvalidActorNameException" = akka-misc "akka.actor.InvalidMessageException" = akka-misc + "akka.actor.ActorRef" = akka-misc + } serialization-identifiers { diff --git a/akka-remote/src/main/scala/akka/remote/serialization/MiscMessageSerializer.scala b/akka-remote/src/main/scala/akka/remote/serialization/MiscMessageSerializer.scala index 266773c78e..2883018822 100644 --- a/akka-remote/src/main/scala/akka/remote/serialization/MiscMessageSerializer.scala +++ b/akka-remote/src/main/scala/akka/remote/serialization/MiscMessageSerializer.scala @@ -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) diff --git a/akka-remote/src/test/scala/akka/remote/serialization/MiscMessageSerializerSpec.scala b/akka-remote/src/test/scala/akka/remote/serialization/MiscMessageSerializerSpec.scala index d6c6366684..869b87bf10 100644 --- a/akka-remote/src/test/scala/akka/remote/serialization/MiscMessageSerializerSpec.scala +++ b/akka-remote/src/test/scala/akka/remote/serialization/MiscMessageSerializerSpec.scala @@ -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) ⇒