uPickle和ScalaJS:密封特征序列化

Jea*_*let 8 serialization scala scala.js upickle

我正试图找到一个基本的上瘾的例子来工作,似乎我在这里遗漏了一些东西.我想尝试在自述文件页面上提供的upickle示例

import upickle._

sealed trait A
@key("Bee") case class B(i: Int) extends A
case object C extends A
Run Code Online (Sandbox Code Playgroud)

然后,我的代码是:

object Model {
  def main(args: Array[String]): Unit = {

    val a = B(5): A
    println(a)

    val out = write(a)
    println(out)

    val a2 = read[A](out)
    println(a2)

    println(a == a2)

  }
}
Run Code Online (Sandbox Code Playgroud)

我得到的只是错误:

引用的特征[[A]]没有任何子类.这可能由于scalac(SI-7046)的限制而发生,因为该特征不在同一包装中.如果是这种情况,则可以使用整数常量来定义层次结构.

我有两个问题:

  • 我怎样才能说服uPickle这个特性在同一个包里?(因为它是.)
  • 或者,如果我不能:如何使用整数常量定义层次结构?

Jea*_*let 8

曾经有过这样的问题,你可以在这样的问题上花费多个小时,你在询问StackOverflow问题后几分钟就解决了吗?

事实证明,由于编译器特定的细节,这样的密封特征直到它定义的文件中的点之后才会知道它的直接子类.所以,在这种情况下,我已经在主方法之后定义了特征及其案例,其中up​​ickle将进行宏扩展和魔术.此时,它不会知道特征的情况.如果在定义特征及其案例之后将main方法移动到同一文件中,它将起作用.