- 
          
 - 
                Notifications
    
You must be signed in to change notification settings  - Fork 143
 
Open
Description
Deserialization fails in an unexpected way in following code. No exception is thrown, however from field of Container is deserialized as Map instead of XY, the program outputs:
Container(Map(x -> 0.0, y -> 0.0))
package my.jackpack
import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.module.scala.DefaultScalaModule
import com.fasterxml.jackson.module.scala.experimental.ScalaObjectMapper
case class XY(x: Double = 0, y: Double = 0)
trait Abstract {
  type Vector2f
  trait ConstructVector2f {
    def apply(x: Double, y: Double): Vector2f
  }
  implicit val Vector2f: ConstructVector2f
}
object Concrete extends Abstract {
  type Vector2f = XY
  object Vector2f extends ConstructVector2f {
    def apply(x: Double, y: Double) = XY(x, y)
  }
}
object Abstract {
  val Link: Abstract = Concrete
}
import Abstract.Link.Vector2f
case class Container(from: Vector2f)
object Main extends App {
  val mapper = new ObjectMapper with ScalaObjectMapper
  mapper.registerModule(DefaultScalaModule)
  val input = Container(Vector2f(0,0))
  val out = mapper.writeValueAsString(input)
  val loaded = mapper.readValue[Container](out)
  val xy: Vector2f = loaded.from
  println(loaded) // prints "Container(Map(x -> 0.0, y -> 0.0))" instead of "Container(XY(0.0,0.0))"
  assert(xy.isInstanceOf[XY]) // fails
}This happens only if the Vector2f is used as import Abstract.Link.Vector2f. Once you change it to Concrete.Vector2f it works fine.
Metadata
Metadata
Assignees
Labels
No labels