【问题标题】:Serialize Function1 to database将 Function1 序列化到数据库
【发布时间】:2012-02-09 00:46:43
【问题描述】:

我知道直接将函数/匿名类序列化到数据库是不可能的,但是有什么替代方法?你知道任何有用的方法吗?

介绍我的情况:我想根据用户的分数来授予用户“徽章”。所以我有不同类型的徽章,可以通过扩展这个类来轻松定义:

class BadgeType(id:Long, name:String, detector:Function1[List[UserScore],Boolean])

检测器成员是一个遍历分数列表的函数,如果用户有资格获得这种类型的徽章,则返回 true。

问题是每次我想添加/编辑/修改徽章类型时,我都需要编辑源代码,重新编译整个东西并重新部署服务器。如果我可以将所有 BadgeType 实例持久化到数据库中,那将更加有用。但是该怎么做呢?

唯一想到的是将函数的主体作为一个脚本(例如:Groovy),在运行时进行评估。

另一种方法(不涉及数据库)可能是将每种徽章类型放入一个 jar 中,我可以在运行时以某种方式热部署,我猜这是插件系统的工作方式。

你怎么看?

【问题讨论】:

  • 我怎么看?我认为你应该问一个比“你怎么看?”更具体的问题
  • @Malvolio 我认为很明显,最后一行只是对我在开头清楚地发布的实际问题的强调:“有哪些选择?你知道任何有用的方法吗? ?”不重复自己是沟通中的常见习语。似乎其他人确实更仔细地阅读了这个问题,因为到目前为止我确实得到了一些很好的答案。

标签: scala serialization plugins


【解决方案1】:

我非常简短的建议是,如果您希望这是真正的数据驱动,您需要实现规则 DSL 和解释器。规则是保存到数据库中的内容,解释器获取一个规则实例并根据某些上下文对其进行评估。

但这在大多数情况下都是矫枉过正的。你最好有一点实际 Scala 代码的 sn-p 代码来实现每个徽章的规则,给它们唯一的 ID,然后将 ID 存储在数据库中。

例如:

trait BadgeEval extends Function1[User,Boolean] {
  def badgeId: Int
}

object Badge1234 extends BadgeEval {
  def badgeId = 1234
  def apply(user: User) = {
    user.isSufficientlyAwesome // && ...
  }
}

您可以拥有一个大的 BadgeEval 实例白名单:

val weDontNeedNoStinkingBadges = Map(
  1234 -> Badge1234,
  5678 -> Badge5678,
  // ...
}

def evaluator(id: Int): Option[BadgeEval] = weDontNeedNoStinkingBadges.get(id)

def doesUserGetBadge(user: User, id: Int) = evaluator(id).map(_(user)).getOrElse(false)

...或者如果您想保持它们解耦,请使用反射:

def badgeEvalClass(id: Int) = Class.forName("com.example.badge.Badge" + id + "$").asInstanceOf[Class[BadgeEval]] 

...如果您对运行时可插拔性感兴趣,请尝试service provider pattern

【讨论】:

  • 感谢您的好评!第一部分就是我现在所拥有的,但它并不能解决这样一个事实,即当我想要一个新的徽章类型时,我需要重新编译整个东西。服务提供商是我一直在寻找的东西。我想在同一思路上自定义 ClassLoader 就足够了,以防它更易于实现。
【解决方案2】:

序列化与数据而不是方法有关。您无法序列化功能,因为它是一个类文件,旨在序列化该功能,而对象序列化会序列化对象的字段。

正如 Alex 所说,您需要一个规则引擎。

如果你想要一些相当简单的东西,那就试试这个,它是基于字符串的,这样你就可以将规则序列化为数据库或文件中的字符串:

http://blog.maxant.co.uk/pebble/2011/11/12/1321129560000.html

除非您在运行时解释或编译代码,否则使用 DSL 会遇到同样的问题。

【讨论】:

    【解决方案3】:

    您可以尝试使用 Scala Continuations - 它们可以让您序列化计算并在以后甚至在另一台机器上运行它。

    一些链接:

    Continuations

    What are Scala continuations and why use them?

    Swarm - Concurrency with Scala Continuations

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-26
      • 2018-03-28
      • 2012-11-11
      • 2014-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多