将 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 class
es 本质上是 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)
如何在源代码中保存案例 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 class
es 本质上是 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)