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



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

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

以及json、xml和开放扩展的常见实现。

我现在面临的问题是序列化本身。目前有不同的上下文对对象进行序列化。想象一下新闻馈送系统。有三个对象:User、Post(提要元素)和Photo。这些对象具有一些属性,并且可以相互引用。现在,在同样的情况下,我想单独序列化对象(用户设置、首选项等),在其他情况下,也需要序列化其他对象,即Feed:List[Post]+相关照片。为了做到这一点,我需要提供被引用的对象。

我当前的实现充斥着可选的参数化函数。

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

我考虑过实现某种上下文解决方案。使用隐式上下文参数重载feedAsJson,该参数将提供必要的数据。我还不知道我想如何实现它,因为它可能会涉及到蛋糕模式的数据库。非常感谢任何建议。

难道不能将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)

您需要在随后被继承的特性中定义默认的可序列化实例(这样低优先级隐含体就在作用域中)。

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

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

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

也许"Scala酸洗;可能对您有所帮助:

http://lampwww.epfl.ch/~hmiller/酸洗

我刚刚看了演讲。

相关内容

  • 没有找到相关文章

最新更新