scala - 反序列化后受案例类定义位置影响的结构平等
问题描述
为什么在反序列化为案例类实例之后,结构相等比较会受到案例类定义的位置在另一个类内部或外部的影响。例如,以下代码段中的断言
package example
import org.json4s.DefaultFormats
import org.json4s.native.JsonMethods.parse
class Foo {
case class Person(name: String)
def bar = {
implicit val formats = DefaultFormats
val expected = Person(name = "picard")
val actual = parse("""{"name": "picard"}""").extract[Person]
assert(expected == actual, s"$expected == $actual")
}
}
object Main extends App {
(new Foo).bar
}
失败了
`java.lang.AssertionError: assertion failed: Person(picard) == Person(picard)`
如果我们像这样将Person
定义移到外面,它就会通过class Foo
case class Person(name: String)
class Foo {
def bar = {
...
assert(expected == actual, s"$expected == $actual")
}
}
请注意,在这两种情况下,反序列化似乎都是成功的,例如,
assert(expected.name == actual.name)
无论case class Person
定义位置如何,都满足。
也许它受到隐式Manifest
传递到的某种影响extract
?
解决方案
这是一个错误。
https://github.com/json4s/json4s/issues/564 “反序列化的内部案例类无法与代码中初始化的案例类进行比较”