Scala案例类的最快序列化/反序列化

use*_*128 16 scala redis

如果我有一个案例类的嵌套对象图,类似于下面的示例,并且我想将它们的集合存储在redis列表中,那么我应该看哪些库或工具可以提供最快的整体往返Redis的?

这将包括:

  • 是时候序列化项目了
  • 传输序列化数据的网络成本
  • 检索存储的序列化数据的网络成本
  • 时间反序列化回案例类

    case class Person(name: String, age: Int, children: List[Person]) {}
    
    Run Code Online (Sandbox Code Playgroud)

Hea*_*ler 28

更新(2018年):不再积极维护scala /酸洗.有许多其他库已经作为替代方案出现,采用类似的方法,但往往侧重于特定的序列化格式; 例如,JSON,二进制,protobuf.

您的用例正是scala/pickling的目标用例(https://github.com/scala/pickling).免责声明:我是作家.

Scala/pickling旨在成为Java或Kryo等自动框架的更快,更安全,更开放的替代方案.它专为分布式应用程序而构建,因此序列化/反序列化时间和序列化数据大小占据了先机.它需要一种不同的序列化方法 - 它在编译时在使用现场生成内联的酸洗(序列化)代码,所以它真的非常快.

最新的基准测试在我们的OOPSLA论文中 - 对于二元泡菜格式(你也可以选择其他格式,如JSON)scala/pickling一直比Java和Kryo​​更快,并产生与Kryo相当或更小的二进制表示,意味着更少通过网络传递pickle数据时的延迟.

有关更多信息,请参阅项目页面:http: //lampwww.epfl.ch/~hmiller/pickling

还有ScalaDays 2013年6月对Parley的演讲.

我们还将介绍一些新的开发,特别是与处理在Strange Loop 2013上通过网络发送闭包有关,以防这可能也是您的用例的痛点.

截至本文撰写时,scala/pickling已预发布,我们的第一个稳定版本计划于8月21日发布.


Bin*_*ang 7

更新:

您必须小心使用JDK中的序列化方法.性能不是很好,您的类中的一个小变化将使数据无法反序列化.


我使用了scala/pickling但是在序列化/反序列化时它具有全局锁定.

因此,我不是使用它,而是编写自己的序列化/反序列化代码,如下所示:

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
  }
}
Run Code Online (Sandbox Code Playgroud)

以下是使用它的示例:

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

val obj = Example("a", "b")
val bytes = Serializer.serialize(obj)
val obj2 = Serializer.deserialize[Example](bytes)
Run Code Online (Sandbox Code Playgroud)