我正在尝试为具有 List[String] 成员的案例类编写自定义pickler。我目前正在使用 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 中,它应该可以工作。问题出在输出 JSON 中,其中notSecond
类的成员Beta
未正确呈现。如您所见,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 集合的方式,我将不胜感激,也许是对我的示例的修复。非常感谢!