将对象存储到文件中

时间:2013-07-09 03:25:52

标签: scala

我想将对象(类的实例)保存到文件中。我没有找到任何有价值的例子。我需要使用序列化吗?

我该怎么做?

更新: 以下是我尝试这样做的方法

import scala.util.Marshal
import scala.io.Source
import scala.collection.immutable
import java.io._

object Example {
  class Foo(val message: String) extends scala.Serializable
  val foo = new Foo("qweqwe")                    
  val out = new FileOutputStream("out123.txt")
  out.write(Marshal.dump(foo))
  out.close
}

首先,out123.txt包含许多额外数据,而且编码错误。我的直觉告诉我应该有另一种正确的方式。

4 个答案:

答案 0 :(得分:6)

在最后一个ScalaDays上,Heather引入了一个新的库,为序列化提供了一种新的酷机制 - pickling。我认为在scala中使用序列化以及你想要的是一种惯用的方式。

在ScalaDays'13上查看关于此主题的paperslidestalk

答案 1 :(得分:2)

也可以使用Jackson从JSON序列化和反序列化。 一个很好的包装,使Scala友好是Jacks

JSON具有以下优点

  • 一个简单的人类可读文字
  • 一种相当有效的格式字节
  • 可以直接使用Javascript
  • 甚至可以使用像Mongo DB
  • 这样的数据库进行本地存储和查询

(编辑)使用示例

序列化为JSON:

val json = JacksMapper.writeValueAsString[MyClass](instance)

...和反序列化

val obj = JacksMapper.readValue[MyClass](json)

答案 2 :(得分:1)

看看Twitter Chill来处理你的序列化:https://github.com/twitter/chill。它是Kyro序列化库的Scala助手。 Github页面上的文档/示例看起来足以满足您的需求。

答案 3 :(得分:0)

只需在此处添加我的答案即可,以方便像我这样的人。

pickling提到的@4lex1v库仅支持Scala 2.10 / 2.11,但我使用的是Scala 2.12。所以我不能在我的项目中使用它。

然后我发现BooPickle。它支持Scala 2.11和2.12!

这里是例子:

import boopickle.Default._

val data = Seq("Hello", "World!")
val buf = Pickle.intoBytes(data)
val helloWorld = Unpickle[Seq[String]].fromBytes(buf)

更多详细信息,请检查here