如果我有一个案例类的嵌套对象图,类似于下面的示例,并且我想将它们的集合存储在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日发布.
更新:
您必须小心使用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)