2013-06-25 24 views
6

Örnek sınıfın, kurucusunda bir süper sınıf alma bağımsız değişkeninin bir alt sınıfı olduğu, uzaktaki uzaktan aktörleri kullanarak bir ileti göndermeye çalışıyorum. İşte Akka uzaktaki aktörler, varsayılan yapıcı olmadan süper sınıf

sorunu yeniden oluşturmaya minimum örnektir:

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") 
    } 
} 

Bu kodu çalıştırırken, aşağıdaki hatayı alıyorum:

[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] 

ben mesajı serisi kaldırılan olamaz çünkü düşünüyorum (ebeveynlerin yapıcısı nedeniyle akka.serialization.JavaSerializer kullanıyor. Sadece bir veya iki mesaj olsaydım, kendi diziselleştiricimi yazabilirdim, fakat benim uygulamada bunun gibi birçok vaka dersim var.

Bu tür nesneleri uzaktaki aktörler kullanarak iletmenin kolay bir yolu var mı?

trait Foo{ 
    val a:Int 
} 
case class MessageFoo(a:Int) extends Foo 

Genellikle deneyin ve vaka sınıfları ile deplasmanda sınıf miras uzak kalmak: Eğer şöyle yapılandırmışsam

cevap

8

şeyler çalışacaktır. Bir dizi vaka sınıfına soyut bir tip olarak başvurabilmem gerekirse, bunun yerine özellikleri kullanırım. cmbaxter cevabı işaret gibi

+1

Burada neler olup bittiğini açıklayabilir misiniz? Ne 'MessageFoo' ne de sizinkilerin argümansız bir kurucusu yoktur. Biri diğeri olmadığında neden Java serileştirme ile çalışır? –

+0

@DanielDarabos, scala vaka sınıfları serileştirilebilir. Bir vaka sınıfı için oluşturulan java koduna bakarsanız, seri hale getirilebilmesi için sözleşmeyi yerine getirdiğini göreceksiniz. – cmbaxter

+0

Ancak sorudaki dava sınıfı, serileştirilemezdi, değil mi? –

9
class A(a: Int) 
case class C() extends A(1) 

, vaka sınıfının üst sınıf no-arg yapıcı yok bu model, seri kaldırma üzerinde InvalidClassException yol açar. Cmbaxter'ın cevabı gereği, bu örüntüden kaçınmak tek bir çözümdür.

Ancak bu desende sorun nedir? sebebi Serializable API docs belgelenmiştir:

To allow subtypes of non-serializable classes to be serialized, the subtype may assume responsibility for saving and restoring the state of the supertype's public, protected, and (if accessible) package fields. The subtype may assume this responsibility only if the class it extends has an accessible no-arg constructor to initialize the class's state. It is an error to declare a class Serializable if this is not the case. The error will be detected at runtime.

Yani sorun class A no-arg yapıcı yok, artı o Serializable değildir. Yani basit bir çözüm Serializable yapmaktır!

class A(a: Int) extends Serializable 
case class C() extends A(1) 
+0

, özelliklerine yeniden yapılanma olarak eklenmiş bir "uzantılar"/"ile" eklemek için cazibe, hızlı bir kazanç gibi çalışır. – Brett

İlgili konular