0

我想用 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 是如何工作的。

4

1 回答 1

1

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

于 2012-07-09T07:49:40.610 回答