2014-12-06 37 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中的小例子也是可以接受的。