【问题标题】:How do you convert a case class to a class?如何将案例类转换为类?
【发布时间】:2014-12-23 06:53:49
【问题描述】:

出于序列化原因,我有一个case classPerson(name:String, id:Int) (MessagePack),我需要将其转换为class。有没有一种不需要太多样板或创建的简单/优雅的方法?

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

【问题讨论】:

  • 我不明白。Case 类是一个只有一些额外方法的类,我认为这些方法与 MessagePack 没有冲突。
  • 如果你想要完全相同的功能,它有很多功能:实现和维护Person.applycopyequalshashCodetoString 并派生自Product .

标签: json scala messagepack


【解决方案1】:

案例类可以序列化为“普通”类,因为它实际上是普通类。 由于它使所有构造函数参数默认可访问,因此它比普通类更适合序列化。

case 类 只是告诉编译器自动将一些方法添加到类中,如 equalshashCode。同时还有一个companion object加了一个apply方法,不过这完全不影响正常的class。

因此,如果序列化出现问题,则问题根源在于其他地方的可能性非常高。

您可以尝试 json4s https://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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-09
    • 1970-01-01
    • 2021-09-27
    • 2015-06-16
    • 2016-07-27
    • 2014-12-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多