Ich versuche, den Beispielcode für Chill Scala von diesem linkAusnahme in Chill Kryo
Ich habe zwei Dummy-Fallklassen
ein laufen ist Benutzer
@SerialVersionUID(1)
case class User(name :String, age : Int) extends Serializable
und der andere ist Student
@SerialVersionUID(2)
case class Student(sub : String , id : Int , user : User) extends Serializable
Hier ist mein Code für die Serialisierung, die ich von diesem githu geändert habe b Beispiel twitter/chill repo
object SeriDeseri {
private val kryo = {
val a = KryoSerializer.registerAll
val k = new Kryo
a(k)
k
}
def toBytes(student : Student): Array[Byte] = {
println("********** serializing")
val b = new ByteArrayOutputStream
val o = new Output(b)
kryo.writeObject(o, student)
o.close()
b.toByteArray
}
def fromBytes[Student](bytes: Array[Byte])(implicit m: Manifest[Student]): Option[Student] = {
println("********** Deserializing")
val i = new Input(bytes)
try {
val t = kryo.readObject(i, m.runtimeClass.asInstanceOf[Class[Student]])
Option(t)
} catch {
case NonFatal(e) => None
} finally {
i.close()
}
}
}
hier ist der Code für meine Hauptklasse
val user = new User("Ahsen", 14)
val stu = new Student("oop", 12, user)
val serial : Array[Byte] = SeriDeseri.toBytes(stu)
val deserial :Option[Student] = SeriDeseri.fromBytes(serial)
val obj = deserial match{
case Some(objec) => println(objec)
case None => println("----------- Nothing was deserialized")
}
Nun das Problem ist, wenn ich diesen Code ausführen es mir java.lang.InstantiationError: scala.runtime.Nothing$
Ausnahme
hier sind komplette Stapel Spuren
gibt[info] Running kryotest.Main
********** serializing
********** Deserializing [error] (run-main-0) java.lang.InstantiationError: scala.runtime.Nothing$ java.lang.InstantiationError: scala.runtime.Nothing$ at scala.runtime.Nothing$ConstructorAccess.newInstance(Unknown Source) at com.esotericsoftware.kryo.Kryo$DefaultInstantiatorStrategy$1.newInstance(Kryo.java:1193) at com.esotericsoftware.kryo.Kryo.newInstance(Kryo.java:1061) at com.esotericsoftware.kryo.serializers.FieldSerializer.create(FieldSerializer.java:547) at com.esotericsoftware.kryo.serializers.FieldSerializer.read(FieldSerializer.java:523) at com.esotericsoftware.kryo.Kryo.readObject(Kryo.java:657) at com.test.hcast_serializer.SeriDeseri$.fromBytes(SeriDeseri.scala:32) at kryotest.Main$.delayedEndpoint$kryotest$Main$1(Main.scala:31) at kryotest.Main$delayedInit$body.apply(Main.scala:9) at scala.Function0$class.apply$mcV$sp(Function0.scala:40) at scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:12) at scala.App$$anonfun$main$1.apply(App.scala:76) at scala.App$$anonfun$main$1.apply(App.scala:76) at scala.collection.immutable.List.foreach(List.scala:383) at scala.collection.generic.TraversableForwarder$class.foreach(TraversableForwarder.scala:35) at scala.App$class.main(App.scala:76) at kryotest.Main$.main(Main.scala:9) at kryotest.Main.main(Main.scala) 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:497) [trace] Stack trace suppressed: run last compile:run for the full output. java.lang.RuntimeException: Nonzero exit code: 1 at scala.sys.package$.error(package.scala:27) [trace] Stack trace suppressed: run last compile:run for the full output. [error] (compile:run) Nonzero exit code: 1 [error] Total time: 4 s, completed Aug 31, 2015 3:15:54 PM
Bitte sagen Sie mir, was mache ich falsch?
Edit: Wenn ich die folgende Zeile aus fromBytes
Methode ersetzt
val t = kryo.readObject(i, m.runtimeClass.asInstanceOf[Class[Student]])
mit
val t = kryo.readClassAndObject(i).asInstanceOf[Student]
Ich weiß nicht, excatly was nach der Änderung passiert ist, aber es hat mir nicht die Ausnahme, sondern die zurückgegebene Methode None
anstelle des Objekts
Ausgabe nach th e Modifikation
********** serializing
********** Deserializing
----------- Nothing was deserialized
eine Sache möchte ich fragen, Ist der Serializer braucht ein Objekt zu sein? Sind die Methoden toBytes und fromBytes statisch? oder wir können sie in einfachen Klassen verwenden? –
Die KryoInjektion ist ein Scala-Objekt, und in diesem Fall verwenden Sie die Methoden invert und apply, und so schlägt Twitter auf github vor, werfen Sie einen Blick auf die Klassenimplementierung https://github.com/twitter/chill/ blob/60bc5a8e36b2d5adf7261dcc0599486f07bb4900/chill-bijektion/src/main/scala/com/twitter/chill/KryoInjektion.scala – anquegi