我在使用Akka序列化的特征中获取案例类时遇到了困难。下面的代码按预期工作:具有特质的案例类的scala/akka
import akka.actor.ActorSystem
import akka.serialization.SerializationExtension
/*trait TestProtocol {*/
sealed abstract class Expr /* extends Serializable */
final case class Literal(v: Double) extends Expr
final case class Plus(a: Expr, b: Expr) extends Expr
final case class Minus(a: Expr, b: Expr) extends Expr
final case class Times(a: Expr, b: Expr) extends Expr
final case class Divide(a: Expr, b: Expr) extends Expr
/*}*/
class Foo /* extends Serializable with TestProtocol */ {
val system = ActorSystem("snitch")
def sample = List(
Plus(Literal(9),Literal(5)),
Times(Plus(Literal(1),Literal(18)),Literal(2))
)
val serialization = SerializationExtension(system)
val serializer = serialization.findSerializerFor(sample)
val bytes = serializer.toBinary(sample)
val back = serializer.fromBinary(bytes, manifest = None)
println(s">>>>>>> pre-serialize: ${sample}")
println(s">>>>>>> deserialized: ${back}")
}
object Main extends App {
val bar = new Foo
bar.system.terminate
}
,但如果我删除了评论,抛出一个异常:
Exception in thread "main" java.io.NotSerializableException: akka.serialization.Serialization
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184)
at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
at scala.collection.immutable.List$SerializationProxy.writeObject(List.scala:468)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:988)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1496)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
at akka.serialization.JavaSerializer$$anonfun$toBinary$1.apply$mcV$sp(Serializer.scala:235)
at akka.serialization.JavaSerializer$$anonfun$toBinary$1.apply(Serializer.scala:235)
at akka.serialization.JavaSerializer$$anonfun$toBinary$1.apply(Serializer.scala:235)
at scala.util.DynamicVariable.withValue(DynamicVariable.scala:58)
at akka.serialization.JavaSerializer.toBinary(Serializer.scala:235)
at buggy.Foo.<init>(Main.scala:22)
at buggy.Main$.delayedEndpoint$buggy$Main$1(Main.scala:29)
尝试反序列化的字节字符串时。即使在我尝试创建任何相关的类可序列化之后,我也会遇到异常(如注释中所示)。
有没有人有任何想法如何使这项工作或为什么失败?我使用的是Scala 2.11.8和Akka 2.4.8;我建立和测试与sbt大会...
非常感谢任何见解!
太棒了!这是一个很好的帮助和一个很好的描述......谢谢! – jetson