是的,正如安迪指出的:
你需要一个scala.pickling.SPickler https://github.com/scala/pickling/blob/825abf361afb455b3595ff8bf4ce53179458ebd2/core/src/main/scala/pickling/Pickler.scala#L18 or a scala.pickling.DPickler https://github.com/scala/pickling/blob/825abf361afb455b3595ff8bf4ce53179458ebd2/core/src/main/scala/pickling/Pickler.scala#L33(分别是静态和动态)以腌制特定类型。
那些都已经进来了scala.pickling
包,因此只需在通用方法签名中使用它们就足够了。
你完全正确,你可以添加一个SPickler
上下文绑定到您的通用方法。您需要的唯一额外的东西(不可否认,它有点难看,我们正在考虑删除它)是添加一个FastTypeTag
也受上下文限制。 (这对于酸洗框架了解它正在尝试酸洗什么类型是必要的,例如,因为它以不同的方式处理基元。)
这是您需要做的来提供通用的酸洗/取消酸洗方法:
请注意,对于unbar
方法,您需要提供一个Unpickler
上下文绑定而不是SPickler
上下文绑定。
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]
}
在 REPL 中对此进行测试,您将得到:
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