Próbuję wysłać wiadomość za pomocą akka zdalnych aktorów, gdzie klasa case jest podklasą superklasy biorącej argument w swoim konstruktorze.Akka zdalnych aktorów, superklasa bez domyślnego konstruktora
Oto minimalny przykład odtworzyć problem:
package com.tuvistavie.testremote
import akka.actor.{ Actor, ActorSystem, Props, ActorLogging }
import com.typesafe.config.ConfigFactory
abstract class Foo(val a: Int)
case class MessageFoo(override val a: Int) extends Foo(a)
object Sender {
def main(args: Array[String]) {
val system = ActorSystem("Sender", ConfigFactory.load.getConfig("sender"))
val actor = system.actorFor("akka://[email protected]:2552/user/receiver")
actor ! MessageFoo(1)
}
}
object Receiver {
class ReceiverActor extends Actor with ActorLogging {
def receive = {
case m: MessageFoo => log.debug(m.toString)
}
}
def main(args: Array[String]) {
val system = ActorSystem("Receiver", ConfigFactory.load.getConfig("receiver"))
val actor = system.actorOf(Props[ReceiverActor], "receiver")
}
}
Po uruchomieniu tego kodu, pojawia się następujący błąd:
[ERROR] [06/26/2013 02:53:16.132] [Receiver-9]
[NettyRemoteTransport(akka://[email protected]:2552)]
[email protected]://[email protected]:2552] Error[java.io.InvalidClassException: com.tuvistavie.testremote.MessageFoo; no valid constructor]
Myślę, że to dlatego, że wiadomość nie może zostać rozszeregować (używając akka.serialization.JavaSerializer
), z powodu konstruktora rodziców. Gdyby to była tylko jedna lub dwie wiadomości, wiem, że mógłbym napisać własny serializator, ale mam mnóstwo takich przypadków w mojej aplikacji.
Czy istnieje jakiś prosty sposób na przekazanie tego rodzaju obiektu za pomocą zdalnych aktorów?
Czy możesz wyjaśnić, co tu się dzieje? Ani pytanie "MessageFoo", ani twoje, nie ma konstruktora no-arg. Dlaczego pracuje się z serializacją Java, a druga nie? –
@ Danielasarabos, klasy przypadków scala można szeregować. Jeśli spojrzysz na wygenerowany kod java dla klasy case, zobaczysz, że spełnia on warunki umowy do serializacji. – cmbaxter
Ale klasa przypadków w pytaniu nie mogła zostać przekształcona do postaci szeregowej, prawda? –