在Scala中使用类型类设计序列化库

时间:2013-08-06 06:03:19

标签: scala lift scala-2.10 lift-json

我有系统需要将不同类型的对象序列化为json和xml。其中一些是Lift MetaRecords,有些是案例类。我想使用类型类并创建类似的东西:

trait Serializable[T] {
  serialize[T](obj: T): T
}

json,xml的常用实现和open for extension。

我现在面临的问题是序列化本身。目前,存在序列化对象的不同上下文。想象一下新闻提要系统。有三个对象:User,Post(feed element)和Photo。这些对象具有一些属性,可以相互引用。现在在相同的情况下我想单独序列化对象(用户设置,首选项等),在其他情况下我还需要序列化其他对象,即。 Feed:列出[发布] +相关照片。为此,我需要提供引用的对象。

我当前的实现是膨胀的,带有可选的参数化函数。

def feedAsJson(post: MPost, grp: Option[PrivateGroup], commentsBox: Option[List[MPostComment]] = Empty): JObject

我考虑过实现某种上下文解决方案。使用隐式上下文参数重载feedAsJson,该参数将提供必要的数据。我不知道我是如何实现它的,因为它可能与蛋糕模式接触数据库。任何建议都非常赞赏。

2 个答案:

答案 0 :(得分:1)

难道你不能将implicits放在可以创建所需的正确序列化器的范围内吗?这样的事情:

def doNothingSerializer[T]: Serializable[T] = ???
implicit def mpostToJson(implicit pgs:Serializable[PrivateGroup]], 
                                  cmts:Serializable[List[MPostComment]]) = 
  new Serializable[MPost] {
    def serialize(mpost: MPost): JObject = {
      val privateGroupJSon = pgs.serialize(mpost.privateGroup)
      // make the mpost json with privateGroupJSon which would be empty
      ???
    }
}

// later where you need to serialize without the inner content:
implicit val privateGroupToJson = doNothingSerializer[PrivateGroup]
implicit val mpostCommentsToJson = doNothingSerializer[List[MPostComment]]
implicitly[Serializable[MPost]].serialize(mpost)

您需要在随后继承的特征中定义默认的可序列化实例(以便low priority implicits在范围内)。

请注意,我假设Serializable的特性是:

trait Serializable[T] {
  def serialize(t: T): JObject
}

(没有[T]方法类型参数并返回JObject

答案 1 :(得分:0)

也许" Scala Pickling"可能对你有帮助:

http://lampwww.epfl.ch/~hmiller/pickling

我刚刚观看了演示文稿。

此致 保罗