首页 文章

Chill-kryo的例外情况

提问于
浏览
4

我试图从这个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 . 没有$ 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 . 在sca处应用$ mcV $ sp(AbstractFunction0.scala:12) la.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)scala.collection.generic.TraversableForwarder $ class.foreach(TraversableForwarder.scala:35)at scala.App $ class.main(App.scala:76)at kryotest.Main $ .main(Main.scala: 9)在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl)的sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)的sun.reflect.NativeMethodAccessorImpl.invoke0(本地方法)的kryotest.Main.main(Main.scala)处 . .java:43)at java.lang.reflect.Method.invoke(Method.java:497)[trace]禁止堆栈跟踪:运行最后一次编译:运行完整输出 . java.lang.RuntimeException:非零退出代码:1在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

1 回答

  • 2

    由于您的示例的git存储库中的示例的第一行说Chill现在支持Scala 2.11 . 请改用它 .

    使用chill from twitter可以轻松地序列化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组成来自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)))
    

相关问题