Skip to content

Instantly share code, notes, and snippets.

@heathermiller
Created November 12, 2014 21:33
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save heathermiller/cb46b062d80fa59f2452 to your computer and use it in GitHub Desktop.
Save heathermiller/cb46b062d80fa59f2452 to your computer and use it in GitHub Desktop.
TypeInfo pickling
package tagged
import scala.pickling._
import internal._
import json._
// final case class TypeInfo(erasureClass: String, typeArguments: Seq[TypeInfo] = Seq.empty)
// final case class AttributeKey(name: String, manifest: TypeInfo)
object TaggedPicklers extends App {
case class Tagged[A: FastTypeTag](key: String) {
// type string of Tagged[A]
val typeString: String = implicitly[FastTypeTag[A]].key
val appliedType: AppliedType = AppliedType.parse(typeString)._1
}
implicit def taggedPickler[A: Manifest: FastTypeTag]: SPickler[Tagged[A]] with Unpickler[Tagged[A]] =
new SPickler[Tagged[A]] with Unpickler[Tagged[A]] {
def pickle(picklee: Tagged[A], builder: PBuilder): Unit = {
builder.beginEntry(picklee)
builder.putField("key", b => {
b.hintTag(FastTypeTag.String)
b.hintStaticallyElidedType()
SPickler.stringPicklerUnpickler.pickle(picklee.key, b)
})
builder.endEntry()
}
def unpickle(tag: => FastTypeTag[_], reader: PReader): Any = {
val reader1 = reader.readField("key")
reader1.hintTag(FastTypeTag.String)
reader1.hintStaticallyElidedType()
val tag1 = reader1.beginEntry()
val key = SPickler.stringPicklerUnpickler.unpickle(tag1, reader1)
reader1.endEntry()
Tagged[Any](key.asInstanceOf[String])(tag.asInstanceOf[FastTypeTag[Any]])
}
}
val t = Tagged[List[Int]]("favNums")
val p = t.pickle
println(p.value)
val up = p.unpickle[Tagged[Any]]
println(up.appliedType)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment