Created
November 12, 2014 21:33
-
-
Save heathermiller/cb46b062d80fa59f2452 to your computer and use it in GitHub Desktop.
TypeInfo pickling
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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