Voglio serializzare una HashMap di tipoHashMap [Coord, Unite] con lift-json. questi tipi sono specifici per il mio progetto ma c'è Coord -> String con la funzione toString e posso avere il mio Coord di nuovo da String (anche se non è codificato qui ma non è rilevante). Quindi ho pensato che potevo chiedere a lift-json di serializzare una mappa [String, Coord] ma qui serializzare (formato) (y) provare ad applicare la stessa funzione (in modo ricorsivo) quando voglio che usi la funzione serialize adattata a Mappa [String, Coord]. La ragione per cui non posso fare la trasformazione al di fuori del Serializer è perché questa HashMap fa parte di una case case più grande, quindi ho bisogno di lift-json per sapere come serializzare e deserializzare.
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)
}
}
}
Potrei riscrivere la serializzazione e la deserializzazione di una mappa [String, Unite] ma sarebbe un codice inutile solo perché non capisco come lift-json funzioni abbastanza.
risposte:
1 per risposta № 1Potrei mancare qualcosa, ma a me sembra che il problema qui sia la cancellazione del tipo; in fase di esecuzione, non c'è differenza tra HashMap[Coord, Unite]
e HashMap[String, Unite]
, che potrebbe spiegare l'infinita ricorsione.