Самая быстрая сериализация/десериализация классов классов Scala - программирование

Самая быстрая сериализация/десериализация классов классов Scala

Если у меня есть граф вложенных объектов классов case, аналогичный приведенному ниже примеру, и я хочу хранить их в списке redis, какие библиотеки или инструменты я должен посмотреть на то, что даст самый быстрый общий круговое путешествие в redis?

Это будет включать:

  • Время сериализации элемента
  • Стоимость передачи сериализованных данных
  • сетевая стоимость извлечения сохраненных сериализованных данных
  • время для десериализации обратно в классы классов

    case class Person(name: String, age: Int, children: List[Person]) {}
    
4b9b3361

Ответ 1

UPDATE (2018): scala/травление больше не поддерживается. Существуют клады других библиотек, которые возникли в качестве альтернатив, которые используют сходные подходы, но которые, как правило, ориентированы на конкретные форматы сериализации; например, JSON, двоичный, protobuf.

Ваш прецедент является целым прецедентом для scala/травления (https://github.com/scala/pickling). Отказ от ответственности: я автор.

Scala/травление было разработано как более быстрая, более типичная и более открытая альтернатива автоматическим фреймворкам, таким как Java или Kryo. Он был построен, в частности, для распределенных приложений, поэтому время сериализации/десериализации и размер сериализованных данных занимают переднее сиденье. Совсем другой подход к сериализации - он генерирует код травления (сериализации), встроенный на сайт-сайт во время компиляции, поэтому он действительно очень быстрый.

Последние тесты находятся в нашей OOPSLA paper - для бинарного формата рассола (вы также можете выбрать другие, такие как JSON) scala/травление последовательно быстрее, чем Java и Kryo, и создает двоичные представления, которые на уровне или меньше, чем у Kryo, что означает меньшую задержку при передаче ваших маринованных данных по сети.

Для получения дополнительной информации есть страница проекта: http://lampwww.epfl.ch/~hmiller/pickling

И ScalaDays 2013 разговора с июня на сайте Parley.

Мы также представим некоторые новые разработки, в частности связанные с отправкой замыканий по сети в Strange Loop 2013, в случае, если это также может быть причиной боли в вашем случае использования.

На момент написания этой статьи scala/травление находится в предварительном выпуске, причем наш первый стабильный релиз запланирован на 21 августа.

Ответ 2

Update:

Вы должны быть осторожны, чтобы использовать методы сериализации из JDK. Производительность невелика, и одно небольшое изменение в вашем классе сделает данные неспособными десериализоваться.


Я использовал scala/травление, но он имеет глобальную блокировку при сериализации/десериализации.

Поэтому вместо того, чтобы использовать его, я пишу свой собственный код сериализации/десериализации следующим образом:

import java.io._

object Serializer {

  def serialize[T <: Serializable](obj: T): Array[Byte] = {
    val byteOut = new ByteArrayOutputStream()
    val objOut = new ObjectOutputStream(byteOut)
    objOut.writeObject(obj)
    objOut.close()
    byteOut.close()
    byteOut.toByteArray
  }

  def deserialize[T <: Serializable](bytes: Array[Byte]): T = {
    val byteIn = new ByteArrayInputStream(bytes)
    val objIn = new ObjectInputStream(byteIn)
    val obj = objIn.readObject().asInstanceOf[T]
    byteIn.close()
    objIn.close()
    obj
  }
}

Вот пример его использования:

case class Example(a: String, b: String)

val obj = Example("a", "b")
val bytes = Serializer.serialize(obj)
val obj2 = Serializer.deserialize[Example](bytes)