2014-12-23 3 views
-1

시리얼 화 이유로 (MessagePack) case classPerson(name:String, id:Int)이 있는데, 이것을 class으로 변환해야합니다. 너무 많은 상용구 또는 생성을 필요로하지 않는 이것을하기위한 쉽고 우아한 방법이 있습니까?사례 클래스를 클래스로 어떻게 변환합니까?

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

+12

나는 이해할 수 없다. 나는 MessagePack과 충돌이 없다고 생각하는 몇 가지 추가 방법이있는 클래스이다. –

+0

똑같은 기능을 원한다면'Person.apply','copy','equals','hashCode','toString'을 구현하고 관리하고'Product'에서 파생시키는 것이 좋습니다. – rightfold

답변

2

사례 클래스는 사실상 통상의 클래스로서 "보통"클래스로 직렬화 될 수있다. 모든 생성자 인수를 기본적으로 액세스 가능하게 만들기 때문에 일반 클래스보다 직렬화에 더 적합합니다.

경우 클래스클래스에해시 코드에 해당 자동으로 몇 가지 방법을 추가하도록 컴파일러에 지시합니다. 동시에 동반 오브젝트입니다. 적용 메소드가 추가되었지만 이는 정상 클래스에 전혀 영향을주지 않습니다.

따라서 직렬화에 문제가 발생하면 문제의 원인이 다른 곳에있을 가능성이 높습니다.

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