首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >uPickle和ScalaJS:封闭的特性序列化

uPickle和ScalaJS:封闭的特性序列化
EN

Stack Overflow用户
提问于 2015-02-20 14:01:00
回答 2查看 929关注 0票数 8

我正试图找到一个基本的例子来发挥作用,似乎我在这里遗漏了一些东西。我想尝试一下在upickle的自述页面上提供的示例

代码语言:javascript
复制
import upickle._

sealed trait A
@key("Bee") case class B(i: Int) extends A
case object C extends A

那么,我的代码是:

代码语言:javascript
复制
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)

  }
}

我只得到了一个错误:

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

我有两个问题:

  • 我怎样才能让uPickle相信这个特性在同一个包中呢?(因为它是。)
  • 或者如果我不能:如何用整数常量定义层次结构?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-02-20 14:18:27

你有过这样的综合症吗?你可以在这样的问题上花上好几个小时,在问完StackOverflow问题几分钟后你就解决了它?

结果发现,由于特定于编译器的细节,这样一个密封的特征直到文件中定义它的点之后才会知道它的直接子类。所以,在这个例子中,我定义了特征及其案例,是继之后的主要方法,upickle会做它的宏扩展和魔术。在这一点上,它将不知道的特点的情况。如果主方法在定义了特征及其案例之后在同一个文件中移动,它就会工作。

票数 8
EN

Stack Overflow用户

发布于 2016-09-11 18:57:25

我在一个Scala.js项目中遇到了这个错误,在这个项目中,我在服务器和客户机之间共享一个密封的抽象类。

解决方案是使用Typelevel编译器,而不是默认的亮点。

这很容易做到:

  1. 把这个放在你的build.propertiessbt.version=0.13.13-M1
  2. 这个在你的build.sbtscalaOrganization in ThisBuild:= "org.typelevel"顶部

为了完整起见,这是我现在可以在客户机和服务器之间共享的类:

代码语言:javascript
复制
sealed abstract class ServerResponse

case class Ok(msg: String) extends ServerResponse

case class Failure(msg: String) extends ServerResponse
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28630780

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档