Kotlin 数据类函数在序列化期间被调用

问题描述 投票:0回答:1

我在 kotlin 项目中有几个数据类:

data class Animation(
    val title: String,
    val userId: Int,
    val height: Int,
    val width: Int,
    val speed: Int,
    val frames: List<Frame>,
    val id: Int? = null
) {
    fun toJson(): String {
        return ObjectMapper().writeValueAsString(this)
    }

    fun getMeta(): AnimationMeta {
        return AnimationMeta(this.id, this.title)
    }
}

data class AnimationMeta(val id: Int? = null, val title: String)

我有一个 API 端点,用于通过 id 获取特定动画:

@GetMapping("/{id}")
fun getAnimation(@PathVariable("id") id: Int): Animation {
    return animationService.getAnimation(id) ?: throw ResponseStatusException(NOT_FOUND)
}

getAnimation 背后的业务逻辑只是查询数据库,将行映射到动画数据类,然后按原样返回。中间没有什么特别的。

当我实际调用此端点时,由于某种原因,我的序列化响应包括对 getMeta 方法的调用:

GET http://localhost:8080/rest/animations/35

{
  "title": "Test",
  "userId": 0,
  "height": 0,
  "width": 0,
  "speed": 0,
  "frames": [],
  "id": 35,
  "meta": {
    "id": 35,
    "title": "Test"
  }
}

函数是如何被调用的?我确信这是我在 kotlin 文档中没有看到的一些细节,但我不太明白。

更新

经过一番挖掘,我发现我可以使用 @JsonIgnore 注释来抑制序列化期间的函数调用:

    @JsonIgnore
    fun getMeta(): AnimationMeta {
        return AnimationMeta(this.id, this.title)
    }

但我把这个问题留下来,因为我不知道为什么我需要使用这个。我习惯使用它来忽略属性,但我仍然不明白为什么函数调用首先发生。这不像

toJson
函数被调用,那么为什么
getMeta
被调用呢?

kotlin serialization data-class
1个回答
-1
投票

如果您不确定是否永久删除您的帐户,您可以先停用它。停用允许您暂时隐藏您的个人资料,如果您改变主意,可以稍后重新激活它。要停用,请转到“设置”>“您的 Facebook 信息”>“帐户所有权和控制”>“停用和删除”>“停用帐户”。

© www.soinside.com 2019 - 2024. All rights reserved.