反序列化后,结构平等受案例类定义位置的影响

时间:2019-04-28 12:19:58

标签: scala equals json4s

为什么在将案例类定义反序列化之后,案例类定义的位置在另一个类的内部或外部,会影响结构相等性比较。例如,以下代码段

中的断言
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定义位置如何,

都满足。

也许是某种程度上受传递到extract的隐式Manifest的影响吗?

2 个答案:

答案 0 :(得分:4)

这是一个错误。

https://github.com/json4s/json4s/issues/564 “反序列化的内部案例类无法与代码中初始化的案例类进行比较”

答案 1 :(得分:2)

由于每个实例都拥有对外部对象的引用,因此无法有效地检查类似内部类的类是否相等。这些引用是等同性检查的一部分:

  class Outer {
    case class Inner(s: String)
  }

  val outer = new Outer()
  val a = outer.Inner("x")
  val b = outer.Inner("x")
  println(a==b) //true
  val c = new Outer().Inner("x")
  println(a==c) //false