我正在尝试从此 link
运行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示例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()
}
}
}
这是我的Main类的代码
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]运行kryotest.Main
**********序列化
**********反序列化 [error](run-main-0)java.lang.InstantiationError:scala.runtime.Nothing $ java.lang.InstantiationError:scala.runtime.Nothing $ at scala.runtime.Nothing $ ConstructorAccess.newInstance(未知来源) 在 com.esotericsoftware.kryo.Kryo $ DefaultInstantiatorStrategy $ 1.newInstance(Kryo.java:1193) 在com.esotericsoftware.kryo.Kryo.newInstance(Kryo.java:1061)at 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)at com.test.hcast_serializer.SeriDeseri $ .fromBytes(SeriDeseri.scala:32) 在kryotest.Main $ .delayedEndpoint $ kryotest $ Main $ 1(Main.scala:31)at 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) 在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) 在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) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在java.lang.reflect.Method.invoke(Method.java:497)[trace] Stack trace suppress:运行last compile:运行完整输出。 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]])
带
val t = kryo.readClassAndObject(i).asInstanceOf[Student]
我不知道修改后发生了什么,但它没有给我异常,但方法返回None
而不是对象
修改后输出
********** serializing
********** Deserializing
----------- Nothing was deserialized
答案 0 :(得分:2)
由于您的示例的git存储库中的示例的第一行说Chill现在支持Scala 2.11。请改用它。
可以轻松地序列化scala对象这是他们所说的:
弛双射
在考虑序列化时,双射和注射很有用。 如果你有从T到阵列[Byte]的注入,你有一个 序列化。此外,如果你在A和B之间有一个Bijection, 和B的序列化,然后你有一个A的序列化 BijectionEnrichedKryo用于在双射和寒冷之间轻松互动。 KryoInjection:轻松序列化为字节数组
KryoInjection是从Any到Array [Byte]的注入。要序列化 使用它:
import com.twitter.chill.KryoInjection
val bytes:Array [Byte] = KryoInjection(someItem)val tryDecode: scala.util.Try [Any] = KryoInjection.invert(bytes)
KryoInjection可以由Bijections和Injections组成 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)))