Я пытаюсь запустить пример кода для чилл-Скала из этого 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
еще одна вещь, которую я хочу спросить, нужно ли сериализатору быть объектом? Стабильность методов toBytes и fromBytes? или мы можем использовать их в простых классах? –
KryoInjection - это объект scala, и в этом случае вы используете методы для инвертирования и применения, и именно так предлагается Twitter в github, взгляните на реализацию класса https://github.com/twitter/chill/ блобо/60bc5a8e36b2d5adf7261dcc0599486f07bb4900/чилл-биекция/SRC/основной/Скал/ком/Twitter/холод/KryoInjection.scala – anquegi