用类型类设计Scala序列化库

hmae6n7t  于 2022-12-04  发布在  Scala
关注(0)|答案(2)|浏览(147)

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

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

和常用的实现为json,xml和开放的扩展。
我现在面临的问题是序列化本身。目前有不同的对象序列化上下文。想象一下新闻提要系统。有三个对象:用户,帖子(提要元素)和照片。这些对象有一些属性,可以相互引用。现在在相同的情况下,我想单独序列化对象(用户设置,首选项等)在其他情况下,我需要其他对象也被序列化,即提要:列出[帖子] +相关照片。为了做到这一点,我需要提供参考对象。
我当前的实现中有很多可选的参数化函数。

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

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

9rygscc1

9rygscc11#

您不能将隐式语句放在一个范围内,以便创建您所需要的正确类型的序列化程序吗?

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
}

(no [T]方法类型参数并返回一个JObject

lfapxunr

lfapxunr2#

也许“Scala腌制”可以帮助你:
http://lampwww.epfl.ch/~hmiller/pickling
我刚看了演示。

相关问题