【发布时间】:2021-03-01 17:28:12
【问题描述】:
假设我定义了以下案例类:
case class C(i: Int) {
lazy val incremented = copy(i = i + 1)
}
然后尝试序列化为json:
val mapper = new ObjectMapper()
mapper.registerModule(DefaultScalaModule)
val out = new StringWriter
mapper.writeValue(out, C(4))
val json = out.toString()
println("Json is: " + json)
会抛出以下异常:
Exception in thread "main" com.fasterxml.jackson.databind.JsonMappingException: Infinite recursion (*Error) (through reference chain: C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]->C["incremented"]-
...
我不知道为什么它首先默认尝试序列化惰性 val?这在我看来不是合乎逻辑的方法
我可以禁用此功能吗?
【问题讨论】:
-
如果您不仅限于使用 jackson-module-scala,请尝试jsoniter-scala。它doesn't serialize fields which are not defined in the constructor.
-
我在 akka 中使用它,所以如果我可以与 akka 集成非常值得一试
-
话虽如此,将 Json4s 与 Jackson 一起使用时,这不是问题。因此,如果无法禁用惰性 val 的序列化,更好的选择可能是将其用作 akka 中的自定义序列化程序。
-
你可以试试
@transient注解。 -
我只是建议您使用真正的 Scala 库而不是 Java 库。例如,circe 开箱即用地支持此功能,请参阅this。
标签: scala jackson-databind akka-cluster json4s