2015-08-31 6 views
5

Я пытаюсь запустить пример кода для чилл-Скала из этого linkИсключение в чилл-Kryo

У меня есть два фиктивных тематические классы

один пользователь

@SerialVersionUID(1) 
case class User(name :String, age : Int) extends Serializable 

и другой is Student

@SerialVersionUID(2) 
case class Student(sub : String , id : Int , user : User) extends Serializable 

вот мой код для сериализации, который я изменил из этого githu б пример 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() 
    } 
    } 
} 

Вот код для моего главного класса

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") 
    } 

Теперь проблема, когда я запускаю этот код дает мне java.lang.InstantiationError: scala.runtime.Nothing$ исключение

здесь полный стек следы

[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

Скажите, пожалуйста, что я делаю неправильно?

Edit: когда я заменил следующую строку из fromBytes метода

val t = kryo.readObject(i, m.runtimeClass.asInstanceOf[Class[Student]])

с

val t = kryo.readClassAndObject(i).asInstanceOf[Student] 

Я не все тоже знаю, что произошло после модификации, но это не давало мне исключение, но возвращенный метод None вместо объекта

мощность после e модификация

********** serializing 
********** Deserializing 
----------- Nothing was deserialized 

ответ

2

Поскольку первая строка примера в репозитории git для вашего примера говорит, что Chill теперь поддерживает Scala 2.11. Вместо этого используйте его.

Существует простой способ сериализации объектов SCALA с использованием chill from twitter

здесь является то, что они сказали:

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.

Так что я переписать свой главный класс:

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) 

} 

и для сборки .sbt использовать это:

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

И, наконец, я получаю этот результат:

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

еще одна вещь, которую я хочу спросить, нужно ли сериализатору быть объектом? Стабильность методов toBytes и fromBytes? или мы можем использовать их в простых классах? –

+0

KryoInjection - это объект scala, и в этом случае вы используете методы для инвертирования и применения, и именно так предлагается Twitter в github, взгляните на реализацию класса https://github.com/twitter/chill/ блобо/60bc5a8e36b2d5adf7261dcc0599486f07bb4900/чилл-биекция/SRC/основной/Скал/ком/Twitter/холод/KryoInjection.scala – anquegi