【问题标题】:Designing serialization library in Scala with type classes使用类型类在 Scala 中设计序列化库
【发布时间】:2013-08-06 06:03:18
【问题描述】:

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

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。我不知道我想如何实现它,因为它可能涉及蛋糕模式的数据库。非常感谢任何建议。

【问题讨论】:

    标签: scala lift scala-2.10 lift-json


    【解决方案1】:

    你不能把隐式放在创建你需要的正确序列化器的范围内吗?大意:

    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

    【讨论】:

    • 我想同时添加 Json 和 XML 序列化程序,因此在 Serializable trait 中使用通用函数。
    • @Lukasz,那么您可以在两个单独的对象或包下创建两个并行的序列化器层次结构并执行import Serializable.Xml._import Serializable.JSon._ 以获得隐含。另一种方法是在Serializable 中同时拥有serializeXMLserializeJson 方法。至少看起来应该是trait Serializable[To] { def serialize[From](from: From): To },而不是到处使用T
    【解决方案2】:

    也许“Scala Pickling”可能对您有所帮助:

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

    我刚刚看了演示文稿。

    问候 保罗

    【讨论】:

    • 序列化本身不是我要解决的问题。我需要解决代码结构,使其易于扩展和重用。然后我将插入已经完成的序列化。
    猜你喜欢
    • 1970-01-01
    • 2010-12-17
    • 1970-01-01
    • 1970-01-01
    • 2011-11-29
    • 2018-03-25
    • 2013-12-27
    • 1970-01-01
    • 2017-03-29
    相关资源
    最近更新 更多