2014-12-23 26 views
-1

我有一個case classPerson(name:String, id:Int)序列化的原因(MessagePack),我需要將其轉換爲class。有沒有簡單/優雅的方式來做到這一點,不需要太多的樣板或創建?如何將案例類轉換爲類?

case class Person(name:String, id:Int) - >class Person(name:String, id:Int)

+12

我不明白.Case類是一個類,只是一些額外的方法,我認爲沒有與MessagePack衝突。 –

+0

如果你想要完全相同的功能,那麼它有很多相同的功能:實現和維護'Person.apply','copy','equals','hashCode','toString'和派生自'Product'。 – rightfold

回答

2

的情況類可以被序列化爲因爲它是事實上的一個普通的類「正常」類。 由於默認情況下所有的構造函數參數都是可訪問的,所以它比一般的類更適合於序列化。

案例類只是告訴編譯器自動添加一些方法如等於的hashCode到類。同時有一個伴隨對象申請方法添加,但這並不影響正常的類。

因此,如果出現序列化問題,那麼問題的根源就在於別處。

您可以嘗試json4shttps://github.com/json4s/json4s將您的案例類轉換爲JSON,然後將其轉換爲MessagePack格式。

import org.json4s._ 
import org.json4s.native.Serialization 
import org.json4s.native.Serialization.{read, write} 
implicit val formats = Serialization.formats(ShortTypeHints(List(classOf[Person]) 
val jsonString : String = write(Person("Andi", 42)) 

// convert with MessagePack as you would do with normal JSON