Chcę serializować HashMap o typieHashMap [Coord, Unite] z lift-json. te typy są specyficzne dla mojego projektu, ale istnieje Coord -> String z funkcją toString i mogę odzyskać Coorda z String (nawet jeśli nie jest tu zakodowany, ale to nie jest istotne). Pomyślałem więc, że mogę poprosić lift-json o serializację mapy [String, Coord], ale tutaj serializuj (format) (y) spróbuj zastosować tę samą funkcję (w sposób rekurencyjny), gdy chcę, aby użyła funkcji serializacji dostosowanej do Mapa [ciąg, koordynacja]. Powodem, dla którego nie mogę wykonać transformacji poza Serializatorem, jest to, że ta HashMap jest częścią większej klasy przypadków, więc potrzebuję lift-json, aby wiedzieć, jak serializować i deserializować.
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)
}
}
}
Mógłbym przepisać serializację i deserializację mapy [String, Unite], ale byłoby to dużo niepotrzebnego kodu tylko dlatego, że nie rozumiem, jak lift-json działa wystarczająco.
Odpowiedzi:
1 dla odpowiedzi № 1Być może czegoś mi brakuje, ale wydaje mi się, że tutaj chodzi o wykasowanie typu; w czasie wykonywania nie ma różnicy między HashMap[Coord, Unite]
i HashMap[String, Unite]
, co może wyjaśniać niekończącą się rekurencję.