Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 如何为具有列表成员的case类编写自定义pickler?_Scala_Scala Pickling - Fatal编程技术网

Scala 如何为具有列表成员的case类编写自定义pickler?

Scala 如何为具有列表成员的case类编写自定义pickler?,scala,scala-pickling,Scala,Scala Pickling,我正在尝试为具有List[String]成员的case类编写一个自定义pickler。我目前正在使用scala酸洗版本0.10.1 我知道使用builder.beginCollection方法来pickle集合,但我无法获得任何有关其用于取消pickle的文档。在阅读了大量scala pickler源代码之后,了解了如何正确使用它 现在我有下面的代码,它生成了错误的输出(在示例之后)。如果能给我一段示例代码或一些文档的链接,我将不胜感激 import scala.pickling._, json

我正在尝试为具有List[String]成员的case类编写一个自定义pickler。我目前正在使用scala酸洗版本0.10.1

我知道使用
builder.beginCollection
方法来pickle集合,但我无法获得任何有关其用于取消pickle的文档。在阅读了大量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中,它应该可以工作。问题出在输出JSON中,类
Beta
notSecond
成员没有正确呈现。 正如您所看到的,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"
        }
        ]
})