Почему объекты case сериализуемы, а классы case нет?

Я играю с этим примеромhttp://scala.sygneca.com/code/remoteactors узнать, как работают удаленные актеры в Scala (2.8.0). В частности, я немного изменил, как сообщения, отправляемые актерами, определяются следующим образом:

sealed trait Event extends Serializable
case object Ping extends Event
case object Pong extends Event
case object Quit extends Event

и все работает как положено. К сожалению, если я определю события как case-классы, а не case-объекты, как в:

sealed trait Event extends Serializable
case class Ping extends Event
case class Pong extends Event
case class Quit extends Event

мой пример перестал работать. Более подробно кажется, что, хотя объекты case являются сериализуемыми, классы case - нет. Действительно, когда я пытаюсь запустить мой пример с этой последней модификацией, я получаю следующее исключение:

scala.actors.remote.DelegateActor@148cc8c: caught java.io.NotSerializableException: scalachat.remote.Ping$
java.io.NotSerializableException: scalachat.remote.Ping$
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1156)
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:326)
    at scala.actors.remote.JavaSerializer.serialize(JavaSerializer.scala:46)
    at scala.actors.remote.NetKernel.namedSend(NetKernel.scala:38)
    at scala.actors.remote.NetKernel.forward(NetKernel.scala:71)
    at scala.actors.remote.DelegateActor$anonfun$acthttp://scala.sygneca.com/code/remoteactors$anonfun$apply$1.apply(Proxy.scala:182)
    at scala.actors.remote.DelegateActor$anonfun$acthttp://scala.sygneca.com/code/remoteactors$anonfun$apply$1.apply(Proxy.scala:123)
    at scala.actors.ReactorTask.run(ReactorTask.scala:34)
    at scala.actors.ReactorTask.compute(ReactorTask.scala:66)
    at scala.concurrent.forkjoin.RecursiveAction.exec(RecursiveAction.java:147)
    at scala.concurrent.forkjoin.ForkJoinTask.quietlyExec(ForkJoinTask.java:422)
    at scala.concurrent.forkjoin.ForkJoinWorkerThread.mainLoop(ForkJoinWorkerThread.java:340)
    at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:325)

Есть ли причина, по которой объекты case можно сделать сериализуемыми, а классы case - нет? Есть ли способ заставить мой пример работать с case-классами?

Изменить: как предложено Виктором и подтверждено Аароном, я посылаю объект-компаньон в виде сообщения вместо класса. Более того, при проверке скомпилированного кода с помощью javap становится очевидным, что хотя класс сериализуем:

public class scalachat.remote.Ping extends java.lang.Object implements scalachat.remote.Event,java.io.Serializable,scala.ScalaObject,scala.Product

сопутствующий объект не является:

public final class scalachat.remote.Ping$ extends scala.runtime.AbstractFunction0 implements scala.ScalaObject

Теперь вопрос: как я могу указать, что я хочу использовать класс вместо объекта-компаньона? Я также добавил пустую пару круглых скобок, когда отправляю сообщение в соответствии с предложением Аарона, например:

pong ! Ping()

но ничего не изменилось. В конце я также добавил фейковый параметр в класс case

case class Ping(i: Int) extends Event

отправив сообщение как:

pong ! Ping(0)

но не испытывая никакой разницы до сих пор. Любое предложение?

Ответы на вопрос(2)

Ваш ответ на вопрос