upickle 在编写案例时给出 ScalaReflectionException class
upickle gives a ScalaReflectionException when writing a case class
我有一个简单的案例class:
object Margin {
def apply(top: Int, right: Int, bottom: Int, left: Int): Margin = {
Margin(Some(top), Some(right), Some(bottom), Some(left))
}
}
case class Margin(top: Option[Int], right: Option[Int], bottom: Option[Int], left: Option[Int])
在上述 class 的实例上调用 upickle.write
时,出现以下异常:
scala.ScalaReflectionException: value apply encapsulates multiple
overloaded alternatives and cannot be treated as a method. Consider
invoking `<offending symbol>.asTerm.alternatives` and manually picking
the required method
此错误消息是什么意思,我该如何解决?
以上错误消息是 Margin
class 具有多个重载 apply
方法的结果。第一个是 case class 的构造函数,另一个是在伴生对象中。 Upickle 不知道要使用哪个 apply
方法,因此会抛出此异常。这是一个 known limitation.
一种解决方法是重命名伴随对象中的 apply
方法。另一种是写一个custom pickler.
这是解决问题的自定义 pickler 的一个有点笨拙的版本:
object Margin {
def create(top: Int, right: Int, bottom: Int, left: Int): Margin = {
Margin(Some(top), Some(right), Some(bottom), Some(left))
}
implicit val marginWriter = upickle.Writer[Margin]{
case m =>
Js.Obj(fields(m).map(kv => (kv._1, Js.Num(kv._2))):_*).asInstanceOf[Js.Value]
}
implicit val marginReader = upickle.Reader[Margin]{
case obj: Js.Obj =>
val map = obj.value.toMap
Margin(map.get("top").map(_.value.asInstanceOf[Int]),
map.get("right").map(_.value.asInstanceOf[Int]),
map.get("bottom").map(_.value.asInstanceOf[Int]),
map.get("left").map(_.value.asInstanceOf[Int]))
}
private def fields(m: Margin) = Seq(m.top.map(("top", _)), m.right.map(("right", _)), m.bottom.map(("bottom", _)),
m.left.map(("left", _))).flatten
}
我有一个简单的案例class:
object Margin {
def apply(top: Int, right: Int, bottom: Int, left: Int): Margin = {
Margin(Some(top), Some(right), Some(bottom), Some(left))
}
}
case class Margin(top: Option[Int], right: Option[Int], bottom: Option[Int], left: Option[Int])
在上述 class 的实例上调用 upickle.write
时,出现以下异常:
scala.ScalaReflectionException: value apply encapsulates multiple
overloaded alternatives and cannot be treated as a method. Consider
invoking `<offending symbol>.asTerm.alternatives` and manually picking
the required method
此错误消息是什么意思,我该如何解决?
以上错误消息是 Margin
class 具有多个重载 apply
方法的结果。第一个是 case class 的构造函数,另一个是在伴生对象中。 Upickle 不知道要使用哪个 apply
方法,因此会抛出此异常。这是一个 known limitation.
一种解决方法是重命名伴随对象中的 apply
方法。另一种是写一个custom pickler.
这是解决问题的自定义 pickler 的一个有点笨拙的版本:
object Margin {
def create(top: Int, right: Int, bottom: Int, left: Int): Margin = {
Margin(Some(top), Some(right), Some(bottom), Some(left))
}
implicit val marginWriter = upickle.Writer[Margin]{
case m =>
Js.Obj(fields(m).map(kv => (kv._1, Js.Num(kv._2))):_*).asInstanceOf[Js.Value]
}
implicit val marginReader = upickle.Reader[Margin]{
case obj: Js.Obj =>
val map = obj.value.toMap
Margin(map.get("top").map(_.value.asInstanceOf[Int]),
map.get("right").map(_.value.asInstanceOf[Int]),
map.get("bottom").map(_.value.asInstanceOf[Int]),
map.get("left").map(_.value.asInstanceOf[Int]))
}
private def fields(m: Margin) = Seq(m.top.map(("top", _)), m.right.map(("right", _)), m.bottom.map(("bottom", _)),
m.left.map(("left", _))).flatten
}