Я хочу серіалізувати тип типу HashMapHashMap [Coord, Unite] з lift-json. ці типи є специфічними для мого проекту, але є Coord -> String з функцією toString, і я можу повернути мій Coord від String (навіть якщо він тут не закодований, але це "не має значення". Тому я думав, що я можу попросити lift-json серіалізувати Map [String, Coord], але тут серіалізувати (формат) (y) спробувати застосувати ту саму функцію (рекурсивно), коли я хочу, щоб вона використовувала функцію serialize, адаптовану до Карта [Рядок, координат]. Причина, по якій я не можу зробити трансформацію за межами 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]
, що може пояснити нескінченну рекурсію.