Scala Pickling and type parameters

前端 未结 2 1546
遇见更好的自我
遇见更好的自我 2021-02-06 09:20

I\'m using Scala Pickling, an automatic serialization framework for Scala. According to the author\'s slides, any type T can be pickled as long as there is an impli

2条回答
  •  感动是毒
    2021-02-06 09:38

    Yep, as Andy pointed out:

    you need either a scala.pickling.SPickler or a scala.pickling.DPickler (static and dynamic, respectively) in order to pickle a particular type.

    Those both already come in the scala.pickling package, so it's enough to just use them in your generic method signature.

    You're absolutely correct that you can add an SPickler context-bound to your generic method. The only additional thing which you need (admittedly it's a bit ugly, and we're thinking about removing it) is to add a FastTypeTag context bound as well. (This is necessary for the pickling framework to know what type it's trying to pickle, as it handles primitives differently, for example.)

    This is what you'd need to do to provide generic pickling/unpickling methods:

    Note that for the unbar method, you need to provide an Unpickler context-bound rather than a SPickler context-bound.

    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]
    }
    

    Testing this in the REPL, you get:

    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
    

提交回复
热议问题