serialization of ActorRef, #21202
This commit is contained in:
parent
e61ffd1132
commit
be319afcd2
3 changed files with 16 additions and 1 deletions
|
|
@ -65,6 +65,8 @@ akka {
|
|||
"akka.actor.InvalidActorNameException" = akka-misc
|
||||
"akka.actor.InvalidMessageException" = akka-misc
|
||||
|
||||
"akka.actor.ActorRef" = akka-misc
|
||||
|
||||
}
|
||||
|
||||
serialization-identifiers {
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
||||
|
|
|
|||
|
|
@ -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) ⇒
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue