5
我想寫一個自定義的SPickler/Unpickler對來解決當前scala-pickling的侷限性。 我試圖pickle的數據類型是一個case類,其中一些字段已經有自己的SPickler和Unpickler實例。 我想在我的自定義pickler中使用這些實例,但我不知道如何。斯卡拉酸洗:爲嵌套結構寫一個自定義的pickler/unpickler
這裏是我的意思的例子:
// Here's a class for which I want a custom SPickler/Unpickler.
// One of its fields can already be pickled, so I'd like to reuse that logic.
case class MyClass[A: SPickler: Unpickler: FastTypeTag](myString: String, a: A)
// Here's my custom pickler.
class MyClassPickler[A: SPickler: Unpickler: FastTypeTag](
implicit val format: PickleFormat) extends SPickler[MyClass[A]] with Unpickler[MyClass[A]] {
override def pickle(
picklee: MyClass[A],
builder: PBuilder) {
builder.beginEntry(picklee)
// Here we save `myString` in some custom way.
builder.putField(
"mySpecialPickler",
b => b.hintTag(FastTypeTag.ScalaString).beginEntry(
picklee.myString).endEntry())
// Now we need to save `a`, which has an implicit SPickler.
// But how do we use it?
builder.endEntry()
}
override def unpickle(
tag: => FastTypeTag[_],
reader: PReader): MyClass[A] = {
reader.beginEntry()
// First we read the string.
val myString = reader.readField("mySpecialPickler").unpickle[String]
// Now we need to read `a`, which has an implicit Unpickler.
// But how do we use it?
val a: A = ???
reader.endEntry()
MyClass(myString, a)
}
}
我真的很感激,工作的例子。 謝謝!
此作品,但有一個奇怪的不對稱:在'pickle'中,字段被命名,如'builder.putField(「myString」,...)',但我們不在'unpickle'中使用這些名稱。這些名稱是否可選,如果是這樣,我們如何避免使用它們? – emchristiansen
一些像JSON這樣的pickle格式將字段名稱放入pickle中。即使它們有時未被使用,目前也無法避免使用它們。儘管如此,API仍在不斷髮展。 –
這個東西不適用於json,只適用於二進制。 – Yar