Scala 奇尔克里奥的例外

Scala 奇尔克里奥的例外,scala,serialization,kryo,Scala,Serialization,Kryo,我正在尝试从下面的代码运行Chill Scala的示例代码 我有两个虚拟案例类 一个是用户 @SerialVersionUID(1) case class User(name :String, age : Int) extends Serializable 另一个是学生 @SerialVersionUID(2) case class Student(sub : String , id : Int , user : User) extends Serializable 这是我在github示

我正在尝试从下面的代码运行Chill Scala的示例代码

我有两个虚拟案例类

一个是用户

@SerialVersionUID(1)
case class User(name :String, age : Int) extends Serializable 
另一个是学生

@SerialVersionUID(2)
case class Student(sub : String , id : Int , user : User) extends Serializable
这是我在github示例中修改的序列化代码

这是我的主类的代码

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$
异常

这里是完整的堆栈跟踪

[信息]正在运行kryotest.Main

**********连载

**********反序列化 [错误](run-main-0)java.lang.实例化错误:scala.runtime.Nothing$ java.lang.InstanceError:scala.runtime.Nothing$at scala.runtime.Nothing$ConstructorAccess.newInstance(未知源) 在 com.esotericsoftware.kryo.kryo$defaultInstanceorStrategy$1.newInstance(kryo.java:1193) 位于com.esotericsoftware.kryo.kryo.newInstance(kryo.java:1061) com.esotericsoftware.kryo.serializers.FieldSerializer.create(FieldSerializer.java:547) 在 com.esotericsoftware.kryo.serializers.FieldSerializer.read(FieldSerializer.java:523) 在com.esotericsoftware.kryo.kryo.readObject(kryo.java:657)上 com.test.hcast\u serializer.SeriDeseri$.fromBytes(SeriDeseri.scala:32) 在kryotest.Main$.delayedEndpoint$kryotest$Main$1(Main.scala:31)处 kryotest.Main$delayedInit$body.apply(Main.scala:9)位于 scala.Function0$class.apply$mcV$sp(Function0.scala:40)位于 scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:12) 在scala.App$$anonfun$main$1.apply(App.scala:76)处 scala.App$$anonfun$main$1.apply(App.scala:76)位于 scala.collection.immutable.List.foreach(List.scala:383)位于 scala.collection.generic.TraversableForwarder$class.foreach(TraversableForwarder.scala:35) 在scala.App$class.main(App.scala:76)的 kryotest.Main$.Main(Main.scala:9)位于kryotest.Main.Main(Main.scala) 位于的sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法) invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在java.lang.reflect.Method.invoke(Method.java:497)[trace]堆栈中 禁止跟踪:运行上次编译:运行完整输出。 java.lang.RuntimeException:非零退出代码:1 at scala.sys.package$.error(package.scala:27)[trace]堆栈跟踪 抑制:运行上次编译:运行完整输出。[错误] (编译:运行)非零退出代码:1[错误]总时间:4秒,已完成 2015年8月31日下午3:15:54

请告诉我我做错了什么

编辑:当我替换
fromBytes
方法中的以下行时

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

我不知道修改后发生了什么,但它没有给我异常,但是方法返回了
None
,而不是对象

修改后的输出

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

由于git存储库中示例的第一行是您的示例,所以Chill现在支持Scala 2.11。请改用它

有一种简单的方法可以使用

他们是这样说的:

冷双射

在考虑序列化时,双射和注入非常有用。 如果从T向数组[Byte]进行注入,则 序列化。另外,如果a和B之间有一个双射, 对B进行序列化,然后对a进行序列化。请参阅 BijectionEnrichedKryo可轻松实现bijection和chill之间的互操作。 KryoInjection:轻松序列化到字节数组

KryoInjection是从任意数组到[Byte]的注入。连载 使用它:

导入com.twitter.chill.KryoInjection

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

KryoInjection可以由双射和来自 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)

}
对于build.sbt,请使用以下命令:

"com.twitter" % "chill-bijection_2.11" % "0.7.0"
最后我得到了这个结果:

[info] Running chill.Main 
Serialized byte array:[B@17e5b410
Success(Student(oop,12,User(Ahsen,14)))

我还想问一件事,序列化程序是否需要是一个对象?toBytes和fromBytes方法是静态的吗?或者我们可以在简单的类中使用它们?KryoInjection是一个scala对象,在这种情况下,您可以使用invert和apply方法,这是Twitter在github上建议的方法,请看一下类的实现
"com.twitter" % "chill-bijection_2.11" % "0.7.0"
[info] Running chill.Main 
Serialized byte array:[B@17e5b410
Success(Student(oop,12,User(Ahsen,14)))