Невозможно сериализовать родовые классы дел, полученные из родового признака

1

Я использую следующий код:

trait ScanList[E] {
  sealed trait Event
  case class Added(item: E) extends Event
  case class Requeued(item: E) extends Event
  case class Processed(item: E, at: DateTime) extends Event
  case class Dequeued(item: E) extends Event
  // some unimplemented methods here..
}

object CharacterScanList extends ScanList[CharacterMetadata] {
    // some implemented methods here..  
}

Используя упорство Акки, чтобы сохранить эти события и восстановить состояние актера. Однако при вызове persist(ev) я получаю следующее исключение:

java.io.NotSerializableException: nl.mdj.wowcrafters.informant.CharacterScanList$
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1183)
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1547)
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1508)
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1431)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1177)
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:347)
    at akka.serialization.JavaSerializer$$anonfun$toBinary$1.apply$mcV$sp(Serializer.scala:129)
    at akka.serialization.JavaSerializer$$anonfun$toBinary$1.apply(Serializer.scala:129)
    at akka.serialization.JavaSerializer$$anonfun$toBinary$1.apply(Serializer.scala:129)
    at scala.util.DynamicVariable.withValue(DynamicVariable.scala:58)
    at akka.serialization.JavaSerializer.toBinary(Serializer.scala:129)
    at akka.persistence.serialization.MessageSerializer.akka$persistence$serialization$MessageSerializer$$payloadBuilder$1(MessageSerializer.scala:151)
    at akka.persistence.serialization.MessageSerializer.akka$persistence$serialization$MessageSerializer$$persistentPayloadBuilder(MessageSerializer.scala:159)
    at akka.persistence.serialization.MessageSerializer.akka$persistence$serialization$MessageSerializer$$persistentMessageBuilder(MessageSerializer.scala:136)
    at akka.persistence.serialization.MessageSerializer.toBinary(MessageSerializer.scala:53)
    at akka.serialization.Serialization$$anonfun$serialize$1.apply(Serialization.scala:90)
    at akka.serialization.Serialization$$anonfun$serialize$1.apply(Serialization.scala:90)
    at scala.util.Try$.apply(Try.scala:191)
    at akka.serialization.Serialization.serialize(Serialization.scala:90)
    at akka.persistence.journal.leveldb.LeveldbStore$class.persistentToBytes(LeveldbStore.scala:96)
    at akka.persistence.journal.leveldb.LeveldbJournal.persistentToBytes(LeveldbJournal.scala:20)
    at akka.persistence.journal.leveldb.LeveldbStore$class.akka$persistence$journal$leveldb$LeveldbStore$$addToMessageBatch(LeveldbStore.scala:102)
    at akka.persistence.journal.leveldb.LeveldbStore$$anonfun$writeMessages$1$$anonfun$apply$1.apply(LeveldbStore.scala:44)
    at akka.persistence.journal.leveldb.LeveldbStore$$anonfun$writeMessages$1$$anonfun$apply$1.apply(LeveldbStore.scala:44)
    at scala.collection.Iterator$class.foreach(Iterator.scala:743)
    at scala.collection.AbstractIterator.foreach(Iterator.scala:1174)
    at scala.collection.IterableLike$class.foreach(IterableLike.scala:72)
    at scala.collection.AbstractIterable.foreach(Iterable.scala:54)
    at akka.persistence.journal.leveldb.LeveldbStore$$anonfun$writeMessages$1.apply(LeveldbStore.scala:44)
    at akka.persistence.journal.leveldb.LeveldbStore$$anonfun$writeMessages$1.apply(LeveldbStore.scala:44)
    at akka.persistence.journal.leveldb.LeveldbStore$class.withBatch(LeveldbStore.scala:88)
    at akka.persistence.journal.leveldb.LeveldbJournal.withBatch(LeveldbJournal.scala:20)
    at akka.persistence.journal.leveldb.LeveldbStore$class.writeMessages(LeveldbStore.scala:44)
    at akka.persistence.journal.leveldb.LeveldbJournal.writeMessages(LeveldbJournal.scala:20)
    at akka.persistence.journal.SyncWriteJournal$$anonfun$receive$1$$anonfun$1.apply$mcV$sp(SyncWriteJournal.scala:27)
    at akka.persistence.journal.SyncWriteJournal$$anonfun$receive$1$$anonfun$1.apply(SyncWriteJournal.scala:27)
    at akka.persistence.journal.SyncWriteJournal$$anonfun$receive$1$$anonfun$1.apply(SyncWriteJournal.scala:27)
    at scala.util.Try$.apply(Try.scala:191)
    at akka.persistence.journal.SyncWriteJournal$$anonfun$receive$1.applyOrElse(SyncWriteJournal.scala:27)
    at akka.actor.Actor$class.aroundReceive(Actor.scala:465)
    at akka.persistence.journal.leveldb.LeveldbJournal.aroundReceive(LeveldbJournal.scala:20)
    at akka.actor.ActorCell.receiveMessage(ActorCell.scala:516)
    at akka.actor.ActorCell.invoke(ActorCell.scala:487)
    at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:238)
    at akka.dispatch.Mailbox.run(Mailbox.scala:220)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:745)

Кажется, сериализатор Java не может обрабатывать производные общие классы классов? Я пробовал sealed trait Event extends Serializable но это не помогло.

Во всяком случае, получилось решение для этого? Может быть, другой сериализатор? Или другой подход, создающий общий набор событий/команд/методов?

Теги:
generics
serialization
akka-persistence

1 ответ

2
Лучший ответ

Найди его.

Чтобы отладить эту проблему, добавьте ее в свои параметры VM;

-Dsun.io.serialization.extendedDebugInfo=true

Оказалось, что sealed trait ScanList[E] должна sealed trait ScanList[E] Serializable.

Ps это не очень хорошая идея, чтобы поставить Events/Command под объект scala, если вы выполняете поиск событий, а ваш домен органичен. Вы больше не сможете десериализовать свой родительский объект, делая ваши постоянные данные бесполезными.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню