Chcem serializovať typ HashMapHashMap [Coord, Unite] s výťahom json. tieto typy sú špecifické pre môj projekt, ale existuje funkcia Coord -> String s funkciou toString a môžem mať svoj Coord späť z reťazca (aj keď to nie je kódované tu, ale to nie je relevantné). Takže som si myslel, že by som mohol požiadať-zdvih-json, aby serializoval mapu [String, Coord], ale tu serializujem (formát) (y), pokúsim sa použiť rovnakú funkciu (rekurzívnym spôsobom), keď chcem, aby použila funkciu serializácie prispôsobenú mapa [String, Coord]. Dôvod, prečo nemôžem vykonať transformáciu mimo Serializer, je ten, že tento HashMap je súčasťou väčšej triedy prípadov, takže musím vedieť, ako ho serializovať a deserializovať, zdvihnúť 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)
}
}
}
Mohol by som prepísať serializáciu a deserializáciu mapy [String, Unite], ale to by bolo veľa zbytočného kódu len preto, že nerozumiem tomu, ako funguje technológia lift-json.
odpovede:
1 pre odpoveď č. 1Možno mi niečo chýba, ale zdá sa mi, že tu ide o vymazanie typu; v čase behu nie je žiadny rozdiel medzi HashMap[Coord, Unite]
a HashMap[String, Unite]
, čo môže vysvetliť nekonečné opakovanie.