Quiero serializar un HashMap que tenga tipoHashMap [Coord, Unite] con lift-json. esos tipos son específicos de mi proyecto, pero hay Coord -> String con la función toString y puedo recuperar mi Coord de String (incluso si no está codificado aquí, pero eso no es relevante). Entonces pensé que podría pedirle a lift-json que serialice un Map [String, Coord] pero aquí serializar (formato) (y) intento aplicar la misma función (de forma recursiva) cuando quiero que use la función de serialización adaptada a Mapa [Cadena, Coord]. La razón por la que no puedo hacer la transformación fuera del serializador es porque este HashMap es parte de una clase de caso más grande, por lo que necesito lift-json para saber cómo serializarlo y deserializarlo.
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)
}
}
}
Podría reescribir la serialización y la deserialización de un Mapa [String, Unite], pero eso sería una gran cantidad de código inútil solo porque no entiendo cómo funciona suficientemente lift-json.
Respuestas
1 para la respuesta № 1Puede que me falte algo, pero me parece que el problema aquí es el borrado de tipo; en tiempo de ejecución, no hay diferencia entre HashMap[Coord, Unite]
y HashMap[String, Unite]
, lo que puede explicar la recursión sin fin.