2015-08-31 5 views
5

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 

Antwort

2

Seit der ersten Zeile des Beispiels im Git Repository für Ihr Beispiel sagen Schauer unterstützt jetzt Scala 2.11. Bitte benutze es stattdessen.

Es gibt eine einfache Möglichkeit, scala Objekte von Serialisierung chill from twitter

hier verwendet wird, was sie sagten:

Chill-bijection

Bijections and Injections are useful when considering serialization. If you have an Injection from T to Array[Byte] you have a serialization. Additionally, if you have a Bijection between A and B, and a serialization for B, then you have a serialization for A. See BijectionEnrichedKryo for easy interop between bijection and chill. KryoInjection: easy serialization to byte Arrays

KryoInjection is an injection from Any to Array[Byte]. To serialize using it:

import com.twitter.chill.KryoInjection

val bytes: Array[Byte] = KryoInjection(someItem) val tryDecode: scala.util.Try[Any] = KryoInjection.invert(bytes)

KryoInjection can be composed with Bijections and Injections from com.twitter.bijection.

ich Ihre Hauptklasse So umschreiben:

object Main extends App { 

    val user = new User("Ahsen", 14) 
    val stu = new Student("oop", 12, user) 



    val bytes: Array[Byte] = KryoInjection(stu) 

    println("Serialized byte array:" + bytes) 

    val tryDecode: scala.util.Try[Any] = KryoInjection.invert(bytes) 

    println(tryDecode) 

} 

und für Ihren Build .sbt verwendet das:

"com.twitter" % "chill-bijection_2.11" % "0.7.0" 

Und ich endlich dieses Ergebnis:

[info] Running chill.Main 
Serialized byte array:[[email protected] 
Success(Student(oop,12,User(Ahsen,14))) 
+0

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? –

+0

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