以下代码显示了使用 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
实例。如果需要,此方法甚至可以保留状态。例如,以下代码将交替调用每个叶子 a
或 b
:
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/