Искам да сериализирам HashMap с типHashMap [Coord, Unite] с лифт-json. тези типове са специфични за моя проект, но има Coord -> String с функцията toString и мога да си върна Coord от String (дори ако той не е кодиран тук, но това не е от значение). Така че мислех, че мога да помоля lift-json да сериализира карта [String, Coord], но тук сериализирам (формат) (y) се опитам да прилагам същата функция (по рекурсивен начин), когато искам да използва сериализиращата функция, адаптирана към Карта [String, Coord]. Причината да не мога да направя трансформацията извън Serializer е, защото този HashMap е част от по-голям случай клас, така че имам нужда от 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)
}
}
}
Мога да пренапиша сериализацията и десериализацията на карта [String, Unite], но това би било много безполезен код, само защото не разбирам как lift-json работи достатъчно.
Отговори:
1 за отговор № 1Може да ми липсва нещо, но ми се струва, че проблемът тук е изтриване на тип; по време на изпълнение, няма разлика между HashMap[Coord, Unite]
и HashMap[String, Unite]
, което може да обясни безкрайната рекурсия.