【问题标题】:Save a case class in Scala to a text file and recreate it without any modification to the case class将 Scala 中的案例类保存到文本文件并重新创建它,而不对案例类进行任何修改
【发布时间】:2017-12-13 14:42:50
【问题描述】:

如何在我的源代码中保存案例类?

背景:

我应该为我写的映射器写一个测试。然而,我的映射器得到了一个案例类,其中包含另一个案例类的数百个对象的列表作为其属性之一。

我的方法:

我会向它添加 Serializable Decorator,因为我在此处阅读了它的描述:https://alvinalexander.com/scala/how-to-use-serialization-in-scala-serializable-trait

我的问题:

我无权访问案例类源。它在我导入的另一个文件中。

第二种方法:

我尝试在类上使用 unapply,我得到一个很长的选项字符串(大约 23000 个字符)。

问题,我不能把它转回一个类,主要是因为作为一个写下来的字符串,它在字符串周围没有引号。

有没有更好的方法?因为如果没有任何帮助,我将需要编写自己的可以序列化的类,接受一个字符串并将其映射回原始案例类。但由于我对 Scala 还很陌生,所以我希望这太过分了,Scala 对此有一个简单的预构建解决方案。

编辑: 哦,是的,我不能只是添加更多的依赖项,因为它不是我的项目。因此,我正在寻找一个标准功能。 (我现在正在研究“myOwnCaseClass”方法。看起来它可能比我上面预期的要少。但我们会看到。

【问题讨论】:

  • 您可以尝试使用 json4s 之类的东西将其编写为 json。
  • 哦,是的,我忘了提。我不能只添加依赖项。仅限标准库。这是我实习中的一个项目。我会用这些信息更新我的问题。
  • 你想序列化一些特定的案例类吗?还是您需要处理一般情况?在一般情况下,您可以序列化并非所有类。想象一下,如果您的班级有一个Thread 类型的字段。怎么可以序列化?使用一些标准的序列化库,例如带有外部配置(json4s、circe、play-json)的 JSON 序列化可能是一个好主意。或者,您可以根据这些库中的想法推出自定义序列化。
  • case classes 本质上是Serializable(只要它的内容是)。 Java 序列化格式可以接受吗?
  • @stefanobaghino 我必须添加装饰器,不是吗?因此我面临同样的问题。

标签: scala case-class


【解决方案1】:

如果 Java 序列化格式是可接受的,您可以将其用于您的目的(case classes 本质上是 Serializable)。这里有几行作为示例(只需更改路径,您就可以将其复制并粘贴到 Scala shell 以查看它的运行):

import java.io._

case class Foo(id: Long, name: Option[String])

val path = ??? // Write your path here

val fooToWrite = Foo(2L, None)
val out = new ObjectOutputStream(new FileOutputStream(path))
out.writeObject(fooToWrite)
out.close()

val in = new ObjectInputStream(new FileInputStream(path))
val fooToRead = in.readObject()
in.close()      

assert(fooToWrite == fooToRead)

【讨论】:

  • 我现在正在尝试这个。可能需要一段时间。我遇到的问题与此无关,但可能与这个想法有关。就像它不允许我阅读的错误消息一样。但我会带着我的成功或危险的故事回来:)
  • 短期更新。 Repl 说你的代码工作正常。集成到我的特定案例类中,它会引发 ClassNotFoundException。我明天再试一次。感谢您迄今为止的帮助。
  • 工作就像一个魅力。非常感谢。
猜你喜欢
  • 2016-12-05
  • 2012-05-15
  • 1970-01-01
  • 2020-10-17
  • 1970-01-01
  • 2019-03-09
  • 1970-01-01
  • 1970-01-01
  • 2014-07-29
相关资源
最近更新 更多