2014-12-23 102 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