2014-12-23 3 views
-1

У меня есть case classPerson(name:String, id:Int) по причинам сериализации (MessagePack). Мне нужно преобразовать это в class. Есть ли простой/элегантный способ сделать это, что не требует слишком большого количества шаблонов или создания?Как преобразовать класс case в класс?

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, чтобы преобразовать ваш класс case в 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 
Смежные вопросы