Scala 奇尔克里奥的例外
我正在尝试从下面的代码运行Chill 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示
@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)))