2

List[String] メンバーを持つケース クラスのカスタム ピックラーを作成しようとしています。現在、scala-pickling バージョン 0.10.1 を使用しています

コレクションをピクルする方法については知っていbuilder.beginCollectionますが、アンピクルするための使用に関するドキュメントを入手できませんでした。scala-pickler のソース コードをよく読んだ後、それを適切に使用する方法についていくつかの指示を見つけました。

現在、次のコードが生成されていますが、出力が間違っていると思います(例の後で)。サンプルコードまたはドキュメントへのリンクをいただければ幸いです。

import scala.pickling._, json._, Defaults._

case class Beta(isSecond : Boolean, notSecond : List[String])

object BetaPickler extends Pickler[Beta] {
    override val tag = FastTypeTag[Beta]

    override def pickle(picklee: Beta, builder: PBuilder): Unit = {
        builder.hintTag(tag) // This is always required
        builder.pinHints()
        builder.beginEntry(picklee)

        builder.putField("isSecond", {
            b => b.hintTag(FastTypeTag.Boolean).beginEntry(picklee.isSecond).endEntry()
        })

        builder.putField("notSecond", { b => {
            b.hintTag(FastTypeTag[String])

            b.beginEntry()
            b.beginCollection(picklee.notSecond.size)

            picklee.notSecond.foreach((item: String) => {

                b.putElement(pb => {
                    pb.hintTag(implicitly[FastTypeTag[String]])
                    stringPickler.pickle(item, pb)
                })
            })

            builder.endCollection()
            builder.endEntry()
        }
        })

        builder.unpinHints()
        builder.endEntry()
    }
}

implicit def pickler: scala.pickling.Pickler[Beta] = BetaPickler

val xBeta : Beta = Beta(true, List("one","three","four"))

したがって、これはサンプルコードです。これをコピーして REPL に貼り付けると、動作するはずです。notSecond問題は、クラスのメンバーがBeta適切にレンダリングされていない出力 JSON にあります。ご覧のとおり、notSecond オブジェクトには空の「value」メンバーがあり、実際の「elem」配列は「notSecond」オブジェクトの直後の外側にありますが、その「value」メンバーの代わりに内側にあると予想されます.

scala> xBeta.pickle
res0: scala.pickling.json.pickleFormat.PickleType =
JSONPickle({
    "$type": "Beta",
    "isSecond": {
        "$type": "scala.Boolean",
        "value": true
    },
    "notSecond": {
        "$type": "java.lang.String",
        "value": "()"
    },
        "elems": [
            {
            "$type": "java.lang.String",
            "value": "one"
        },
            {
            "$type": "java.lang.String",
            "value": "three"
        },
            {
            "$type": "java.lang.String",
            "value": "four"
        }
        ]
})

List コレクションをピクルする方法についてのコメントと、おそらく私の例の修正をお願いします。どうもありがとう!

4

0 に答える 0