scala - 如何在反序列化期间初始化 transient 字段?

标签 scala serialization jackson deserialization transient

以下代码显示了使用 Jackson 的简单类的序列化和反序列化。问题是在反序列化期间,不会调用 Root 的正常构造函数,因此 Leaf 类的 transient 字段 name 不具有构造时的值起初。有没有什么方法可以为 transient 字段提供所需的值,而不必将它们设为变量?一些自定义序列化程序或一些巧妙的注释?

我不想序列化 name 值以保持序列化格式尽可能紧凑 - 毕竟值是由数据结构给出的,并且应该可以再次从结构中重新创建它.

import com.fasterxml.jackson.annotation._
import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.module.scala.DefaultScalaModule
import com.fasterxml.jackson.module.scala.experimental.ScalaObjectMapper

class Leaf(val value:Int, @transient val name:String) {

  def this(@JsonProperty value:Int) = this(value,"")
}

class Root(val a: Leaf, val b:Leaf)

object Main extends App {
  val om = new ObjectMapper() with ScalaObjectMapper {
    registerModule(new DefaultScalaModule)
  }

  val root = new Root(new Leaf(1,"a"), new Leaf(2, "b"))

  val out = om.writeValueAsString(root)

  println(out)

  val test = om.readValue(out, classOf[Root])

}

最佳答案

您始终可以使用一种方法来命名备用构造函数中的 Leaf 实例。如果需要,此方法甚至可以保留状态。例如,以下代码将交替调用每个叶子 ab:

class Leaf(val value: Int, @transient val name: String) {
    def this(@JsonProperty value:Int) = { 
        this(value, Leaf.namer.next)
    }
}

object Leaf {
    private val namer = Iterator.continually(Seq("a", "b")).flatten
}

关于scala - 如何在反序列化期间初始化 transient 字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28569822/

相关文章:

java/jackson - 链式@JsonValue 注释和反序列化

java - 如何使用 java 删除 MongoDB 上的特定字段?

java - 无法识别的 VM 选项 'AggressiveOpts'

c# - 如果我在 c# 中序列化一个类,Unrealscript 可以读回它吗?

c# - 如何在剪贴板中存储对象集合?

php - 在 SQL 中反序列化 PHP 数组

java - 使用 Jackson 将单个 java 字段映射到两个 JSON 字段

json - 解码大小写类,大约为String或Int

scala - 什么是 Scala 中的一流模块?

java - 如何正确管理 Elastic Java Rest Client 超时