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

使用类型类在Scala中设计序列化库,scala,lift,scala-2.10,lift-json,Scala,Lift,Scala 2.10,Lift Json,我有一个需要将不同类型的对象序列化为json和xml的系统。其中一些是Lift元记录,一些是case类。我想使用类型类并创建如下内容: trait Serializable[T] { serialize[T](obj: T): T } json、xml和open for extension的常见实现 我现在面临的问题是序列化本身。目前,序列化对象的上下文不同。想象一下新闻提要系统。有三个对象:用户、帖子(提要元素)和照片。这些对象具有某些属性,可以相互引用。现在,在同样的情况下,我想单独序

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

trait Serializable[T] {
  serialize[T](obj: T): T
}
json、xml和open for extension的常见实现

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

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

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

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

您能否将隐式表达式放入范围,以创建您所需的正确类型的序列化程序?大意如下:

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 Pickling”可以帮助您:

我刚看了演示

问候
Paul

我想同时添加Json和XML序列化程序,从而在Serializable trait中添加泛型函数。@Lukasz,然后您可以在两个单独的对象或包下创建两个并行的序列化程序层次结构,并执行
导入Serializable.XML.\u
导入Serializable.Json.\u
以获取隐式。另一种方法是在
Serializable
中同时使用
serializeXML
serializeJson
方法。至少它应该是
trait Serializable[To]{def serialize[From](From:From):To}
而不是到处使用
T
。序列化本身并不是我试图解决的问题。我需要解决代码结构,使其易于扩展和重用。然后我将插入已经完成的序列化。