【问题标题】:Serialiaze a map[A,B] with lift-json knowing A<->String序列化 map[A,B] 与 lift-json 知道 A<->String
【发布时间】:2012-07-08 12:16:01
【问题描述】:

我想用 lift-json 序列化一个 HashMap[Coord,Unite] 类型的 HashMap。这些类型是特定于我的项目的,但是有 Coord -> String 和 toString 函数,我可以从 String 中取回我的 Coord(即使它没有在这里编码,但这不相关)。 所以我想我可以要求 lift-json 序列化 Map[String,Coord] 但是在这里 serialize(format)(y) 当我希望它使用适用于的序列化函数时尝试应用相同的函数(以递归方式)地图[字符串,坐标]。我不能在 Serializer 之外进行转换的原因是因为这个 HashMap 是一个更大的案例类的一部分,所以我需要 lift-json 来知道如何序列化和反序列化它。

class UnitzSerializer extends Serializer[HashMap[Coord,Unite]] {

private val UnitzClass = classOf[HashMap[Coord,Unite]]

def deserialize(implicit format:Formats): PartialFunction[(TypeInfo,JValue), HashMap[Coord,Unite]]= {
case (TypeInfo(UnitzClass,_), json) => json match {
  case x:JValue => (deserialize(format)((TypeInfo(classOf[Map[String,Unite]],None),x))).map(y => (Coord(0,0),y._2))
  case _  => throw new Exception("ONOz")
}
}


def serialize(implicit format: Formats): PartialFunction[Any, JValue] = {
       case x: HashMap[Coord,Unite] => {
     val y:Map[String,Unite] = x.map(z => (z._1.toString,z._2))
 serialize(format)(y)
   }
}

}

我可以重写 Map[String,Unite] 的序列化和反序列化,但这将是很多无用的代码,因为我不太了解 lift-json 的工作原理。

【问题讨论】:

    标签: json scala serialization lift-json


    【解决方案1】:

    我可能遗漏了一些东西,但在我看来这里的问题是类型擦除;在运行时,HashMap[Coord, Unite] 和 HashMap[String, Unite] 之间没有区别,这可以解释无限递归。

    【讨论】:

    • 它可以,但据我记得你没有得到序列化;对于反序列化,您必须自己从 TypeInfo 构造它。不平凡也不漂亮。
    猜你喜欢
    • 1970-01-01
    • 2021-01-30
    • 2021-10-06
    • 2013-07-02
    • 2011-10-20
    • 2015-12-08
    • 1970-01-01
    • 2020-07-16
    • 2015-06-12
    相关资源
    最近更新 更多