2014-12-06 55 views
1

我想通过Twitter的chill-scala库使用Kryo序列化一个Scala类的实例。它来自一个图书馆(外部的罐子),因此,我认为,需要向Kryo注册。通过twitter注册一个类Kryo chill-scala

如何使用chill-scala注册一个类以(de)序列化?

这里是我的代码的核心,主要基于检查寒冷的斯卡拉测试套件。

// This is from the chill-scala test suite 
def serialize[T](t: T): Array[Byte] = ScalaKryoInstantiator.defaultPool.toBytesWithClass(t) 
def deserialize[T](bytes: Array[Byte]): T = 
    ScalaKryoInstantiator.defaultPool.fromBytes(bytes).asInstanceOf[T] 


/** 
* Save a value in cache. 
*/ 
def save[T](key: String, value: T, expiration: Int = 0): Future[T] = { 
    cache.put(key, serialize[T](value), expiration, TimeUnit.SECONDS) 
    Future.successful(value) 
} 

/** 
* Finds a value in the cache. 
*/ 
def find[T: ClassTag](key: String): Future[Option[T]] = Future { 
    val result = deserialize[T](cache.get(key).asInstanceOf[Array[Byte]]) 
    Option(result) 
} 

当我运行它时,它抛出

com.esotericsoftware.kryo.KryoException: Unable to find class: <name_of_external_class> 

更一般地,是有关于如何使用寒意 - 斯卡拉文档某处?这个软件包的作者显然做了大量的工作,我看到了一些积极的参考 - 但没有文档。

感谢任何指针,

拜伦

回答

0

我相信寒意只是一个扩展KRYO,提供串行支持的Scala类比KRYO默认FieldSerializer更好。

所以,如果你不知道如何使用寒意,你应该尝试阅读the docs of Kryo

而且,中

Unable to find class: <name_of_external_class> 

的例外可能是因为该类不是在你的类路径。它可能不涉及Kryo。

请注意,即使没有在Kryo中注册,该类仍然可以被Kryo序列化。

如果您需要使用寒意的好例子,Apache Spark的源代码是一个不错的选择。此外,this repo中的小例子也是可以接受的。