将 Scala 中的案例 class 保存到文本文件,然后在不对案例 class 进行任何修改的情况下重新创建它

Save a case class in Scala to a text file and recreate it without any modification to the case class

如何在源代码中保存案例 class?

背景:

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

我的方法:

我会在此处阅读时向其添加可序列化装饰器:https://alvinalexander.com/scala/how-to-use-serialization-in-scala-serializable-trait

我的问题:

我无法访问案例 classes 来源。它在我导入的另一个文件中。

第二种方法:

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

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

有没有更好的方法?因为如果没有任何帮助,我将需要编写自己的 class 来序列化,接受一个字符串并将其映射回原始大小写 class。但由于我是 Scala 的新手,我希望这会过火,Scala 有一个简单的预构建解决方案。

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

如果 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)