作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 Scala Pickling ,Scala 的自动序列化框架。
根据author's slides , 任何类型 T
只要有隐式 Pickler[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.SPickler
都出现相同的错误和
scala.pickling.DPickler
.
最佳答案
是的,正如安迪指出的那样:
you need either a
scala.pickling.SPickler
or ascala.pickling.DPickler
(static and dynamic, respectively) in order to pickle a particular type.
scala.pickling
包,因此只需在您的通用方法签名中使用它们就足够了。
SPickler
是绝对正确的上下文绑定(bind)到您的通用方法。您需要的唯一额外的东西(诚然它有点难看,我们正在考虑删除它)是添加一个
FastTypeTag
上下文绑定(bind)也是如此。 (这对于酸洗框架来说是必要的,以了解它正在尝试酸洗什么类型,因为它以不同的方式处理基元,例如。)
unbar
方法,您需要提供
Unpickler
上下文绑定(bind)而不是
SPickler
上下文绑定(bind)。
import scala.pickling._
import binary._
object Foo {
def bar[T: SPickler: FastTypeTag](t: T) = t.pickle
def unbar[T: Unpickler: FastTypeTag](bytes: Array[Byte]) = bytes.unpickle[T]
}
scala> Foo.bar(42)
res0: scala.pickling.binary.BinaryPickle =
BinaryPickle([0,0,0,9,115,99,97,108,97,46,73,110,116,0,0,0,42])
scala> Foo.unbar[Int](res0.value)
res1: Int = 42
关于Scala酸洗和类型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18725699/
我是一名优秀的程序员,十分优秀!