我想序列化一个具有HashMapCoord类型的HashMap,Unite with lift-json。这些类型是特定于我的项目的,但是有带有toString函数的Coord ->字符串,我可以从String中恢复我的Coord (即使它没有在这里编码,但这并不重要)。所以我想我可以让lift-json来序列化一个格式,但是在这里serialize ( MapString )(Y)尝试应用相同的函数(以递归的方式),当我想让它使用适应于MapString的序列化函数时。我不能在序列化程序之外进行转换的原因是因为这个HashMap是一个更大的case类的一部分,所以我需要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)
}
}
}我可以重写MapString的序列化和反序列化,但那将是许多无用的代码,因为我不太了解lift-json是如何工作的。
发布于 2012-07-09 15:49:41
我可能遗漏了一些东西,但在我看来,这里的问题是类型擦除;在运行时,HashMap[Coord, Unite]和HashMap[String, Unite]之间没有区别,这可能解释了无休止的递归。
https://stackoverflow.com/questions/11389285
复制相似问题