0

タイプHashMap[Coord、Unite]のHashMapをlift-jsonでシリアル化したい。これらのタイプは私のプロジェクトに固有ですが、toString関数を使用してCoord-> Stringがあり、StringからCoordを戻すことができます(ここでコーディングされていなくても、関係ありません)。だから私はlift-jsonにMap[String、Coord]をシリアル化するように頼むことができると思いましたが、ここでserialize(format)(y)は、に適合したシリアル化関数を使用したいときに同じ関数を(再帰的に)適用しようとしますMap [String、Coord]。シリアライザーの外部で変換を実行できない理由は、この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)
   }
}

}

Map [String、Unite]のシリアル化と逆シリアル化を書き直すことはできますが、lift-jsonがどのように機能するかを理解していないという理由だけで、多くの役に立たないコードになります。

4

1 に答える 1

1

何かが足りないかもしれませんが、ここでの問題は型の消去です。HashMap[Coord, Unite]実行時には、 と の間に違いはなくHashMap[String, Unite]、これが無限再帰を説明している可能性があります。

于 2012-07-09T07:49:40.610 に答える