如何使用List成员为case类编写自定义pickler?

时间:2016-07-14 12:04:44

标签: scala scala-pickling

我正在尝试为具有List [String]成员的案例类编写自定义pickler。我目前正在使用scala-pickling版本0.10.1

我知道用于挑选集合的builder.beginCollection方法,但我无法获得有关其用于unpickle的任何文档。经过大量阅读scala-pickler源代码I have found some indication后如何正确使用它。

现在我有以下代码生成,我认为输出错误(关于示例后的内容)。我将很感激一段示例代码或一些文档的链接。

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中,它应该可以工作。问题出在输出JSON中,其中类notSecond的{​​{1}}成员未正确呈现。 正如你所看到的那样,notSecond对象有一个空的“value”成员,而实际的“elem”数组就在“notSecond”对象之后,而我希望它在里面,代替那个“value”成员

Beta

我会很感激我在挑选List集合的方式上的一些评论,也许是我的例子的修复。 非常感谢!

0 个答案:

没有答案