【发布时间】:2013-09-10 17:50:40
【问题描述】:
我正在使用Scala Pickling,这是一个用于 Scala 的自动序列化框架。
根据author's slides,只要在范围内有隐式Pickler[T],任何类型的T 都可以被腌制。
在这里,我假设她的意思是scala.tools.nsc.io.Pickler。
但是,以下内容无法编译:
import scala.pickling._
import scala.pickling.binary._
import scala.tools.nsc.io.Pickler
object Foo {
def bar[T: Pickler](t: T) = t.pickle
}
错误是:
[error] exception during macro expansion:
[error] scala.ScalaReflectionException: type T is not a class
[error] at scala.reflect.api.Symbols$SymbolApi$class.asClass(Symbols.scala:323)
[error] at scala.reflect.internal.Symbols$SymbolContextApiImpl.asClass(Symbols.scala:73)
[error] at scala.pickling.PickleMacros$class.pickleInto(Macros.scala:381)
[error] at scala.pickling.Compat$$anon$17.pickleInto(Compat.scala:33)
[error] at scala.pickling.Compat$.PickleMacros_pickleInto(Compat.scala:34)
我正在使用带有 scala-pickling 0.8-SNAPSHOT 的 Scala 2.10.2。
这是错误还是用户错误?
编辑 1:scala.pickling.SPickler 和 scala.pickling.DPickler 都会出现相同的错误。
编辑 2:看起来这是一个错误:https://github.com/scala/pickling/issues/31
【问题讨论】:
-
我最近也对这个项目产生了兴趣(我相信创建者 Heather Miller 在另一篇文章的 Stackoverflow 上提到了它).. 但我找不到很多好的例子来开始。根据我目前使用 Scala 的学习曲线,宏相当复杂,所以我希望有更多的例子。同样适用于 Twitter Chill!
-
快速浏览一下实现表明您需要的不是
scala.tools.nsc.io.Pickler,而是scala.pickling.SPickler(或scala.pickling.DPickler)。只需将您的定义更改为def bar[T: SPickler](t: T) = t.pickle,然后看看效果如何。 -
SPickler 或 DPickler 都不行(见编辑)。
-
是的,您已经猜到了,但无论如何要确认,您需要
scala.pickling.SPickler或scala.pickling.DPickler。不理会scala.tools.nsc.io.Pickler(Scala 编译器使用它来pickle/unpickle 类文件) -
是的,当涉及到处理抽象类型的酸洗框架时,你是对的。感谢您的报告,并与我们在一起:)
标签: scala scala-pickling