我知道有 Jerkson 和 scalaxb 甚至 Java 的 XStream 能够成功地序列化 scala 的数据。我知道他们可以很好地处理字符串、整数甚至案例类。但是,如果我将功能作为字段之一?
例如如果我有类似的东西:
case class Foo(bar: (Int) => Boolean, baz: Int)
这些字段能否以某种方式序列化为 JSON 或 XML(实际上,我不在乎是哪一个,它们应该是人类可读的,这就是我不想使用 SBinary 的原因)?
编辑
我为什么要这样做?
现在我正在编写决策树的实现。我不想每次都从训练数据中重建那些树,因此我需要序列化它们,这部分可以用 SBinary 完成。但另外,如果作为人类我们可以查看序列化树并对其进行分析,那就太好了。
这不是我在标题中写的那么广泛的任务,是的。
我现在想的是用我自己的格式编写一个自定义序列化程序(例如用于 Jerkson),或者写入字符串字段然后解析它。
但我认为可能有一些更好的方法来执行它。
最佳答案
不,函数不一定是可序列化的……而且可序列化的函数不太可能提供人类可读的序列化。
如果你想能够提供任何一种功能,恐怕没有任何解决方案。如果可以在您的场景中使用,一个可能的解决方法是构建一个实现 Function[Int, Boolean]
的案例类。从而回到案例类场景。
例如,假设您已经隔离了所有函数检查一个整数是否可以被给定的整数整除:
case class Mod(mod: Int) extends Function[Int, Boolean] { //the extends part is not even require
def apply(x: Int) = x % mod == 0
}
case class Foo(bar: Mod, baz: Int)
这显然是非常严格的。但恐怕这是你能做到的最好的。
根据你的编辑。一种解决方案可能是拥有一种工厂类:
case class IntTest(humanReadableDescription: String) {
def apply(x: Int) = IntTest.fromString(humanReadableDescription)(x)
}
object IntTest {
private val fromString = Map[String, Function[Int, Boolean]] (
"mod2" -> {x:Int => x % 2 == 0},
"is42" -> {x:Int => x == 42}
)
}
case class Foo(bar: IntTest, baz: Int)
但是在这里,您将失去类型安全性。
关于scala - scala 函数的序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9770353/