5
scala-picklingの現在の制限を回避するためにカスタムSPickler/Unpicklerのペアを作成しようとしています。 私がピケをしようとしているデータ型は、フィールドのいくつかがすでに独自のSPicklerとUnpicklerインスタンスを持っているケースクラスです。 私のカスタムピックラーでこれらのインスタンスを使用したいと思いますが、私はどのようにわかりません。私は実際に作業例をいただければ幸いですScala Pickling:ネストされた構造のカスタム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)
}
}
:
は、ここで私が何を意味するかの例です。 ありがとう! MyClass
の型パラメータは、コンテキスト境界を必要としないことを
case class MyClass[A](myString: String, a: A)
注:ここでは
これは動作しますしかし、奇妙な非対称性があります。 'pickle'では、' builder.putField( "myString"、...) 'のようにフィールド名が付けられますが、' unpickle'ではそれらの名前を使用しません。これらの名前はオプションですか?その場合は、どうすれば使用できますか? – emchristiansen
JSONのようないくつかのpickleフォーマットは、フィールド名をpickleに入れます。たとえそれらが未使用のものであったとしても、現在それらを使用することを避ける方法はありません。 APIはまだ少し進化しています。 –
これはjsonではバイナリでしか動作しません。 – Yar