加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala函数的序列化

发布时间:2020-12-16 09:28:54 所属栏目:安全 来源:网络整理
导读:我知道有Jerkson和scalaxb甚至Java的XStream都能成功地序列化scala的数据.我知道他们很好地处理好字符串,整数甚至案例类.但如果我有一个领域的功能? 例如如果我有类似的东西: case class Foo(bar: (Int) = Boolean,baz: Int) 这些字段可以以某种方式序列化
我知道有Jerkson和scalaxb甚至Java的XStream都能成功地序列化scala的数据.我知道他们很好地处理好字符串,整数甚至案例类.但如果我有一个领域的功能?

例如如果我有类似的东西:

case class Foo(bar: (Int) => Boolean,baz: Int)

这些字段可以以某种方式序列化为JSON或XML(实际上,我不关心哪一个,它们应该是人类可读的,这就是为什么我不想使用SBinary)?

编辑

我为什么要那样做?
现在我正在编写决策树的实现.我不想每次从训练数据重建那些树,因此我需要序列化它们,那部分可以用SBinary来完成.但另外,如果作为人类我们可以查看序列化树并进行分析,那将是很好的.

这不是我在标题中写的那么广泛的任务,是的.
我现在想的是用自己的格式编写自定义序列化程序(例如Jerkson),或者写入字符串字段然后再解析它.

但我认为可能有一些疯狂的更好的方式来执行.

解决方法

不,函数不是必需的可序列化的……并且可序列化的函数不太可能提供人类可读的序列化.

如果您希望能够提供任何功能,我担心不会有任何解决方案.如果可以在您的场景中使用,可能的解决方法是构建一个实现Function [Int,Boolean]的case类,从而返回到case类场景.

例如,假设您已经隔离了所有函数检查整数是否可以被给定的整数整除:

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)

但在这里,你将失去类型安全.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读