【问题标题】:Serialize class as its one member with Jackson将类序列化为杰克逊的一个成员
【发布时间】:2015-05-21 01:19:15
【问题描述】:

有时该类只有一个要序列化的成员(其他成员是瞬态的),我想将该类作为其唯一成员进行序列化和反序列化。

考虑以下代码:

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

case class Content(i:Seq[Int])

case class Wrap(content:Content)

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

  val roots = Wrap(Content(Seq(1,2,3)))

  val out = om.writeValueAsString(roots)

  println(out)

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

}

Wrap的序列化结果是{"content":{"i":[1,2,3]}}

我只想得到{"i":[1,2,3]}。我想我可以使用自定义序列化器/反序列化器来做到这一点,但在实际情况下,内容是一个复杂的类,这意味着我必须手动序列化内容,如果我没记错的话。我更喜欢一些更直接的解决方案。

是否可以将序列化/反序列化“委托”给成员/构造函数参数?

【问题讨论】:

    标签: scala serialization jackson


    【解决方案1】:

    可以使用converters 来完成,它可以使用JsonSerializeJsonDeserialize 属性来修改Jackson 的行为。

    import com.fasterxml.jackson.databind.annotation.{JsonSerialize, JsonDeserialize}
    import com.fasterxml.jackson.databind.util.StdConverter
    
    @JsonDeserialize(converter=classOf[WrapConverterDeserialize])
    @JsonSerialize(converter=classOf[WrapConverterSerialize])
    case class Wrap(content:Content)
    
    class WrapConverterDeserialize extends StdConverter[Content,Wrap] {
      override def convert(value: Content) = new Wrap(value)
    }
    class WrapConverterSerialize extends StdConverter[Wrap,Content] {
      override def convert(value: Wrap) = value.content
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-16
      • 2014-03-11
      • 1970-01-01
      • 1970-01-01
      • 2018-04-07
      • 1970-01-01
      • 2016-05-14
      • 2017-11-09
      相关资源
      最近更新 更多