gpt4 book ai didi

json - (de) 使用 jackson 序列化 kotlin 委托(delegate)属性

转载 作者:行者123 更新时间:2023-12-02 12:16:08 25 4
gpt4 key购买 nike

如何使用 jackson (反)序列化 kotlin 委托(delegate)属性。
我有这样的课

class MyClass {
var a: Int = 42
set(value) {
val changed = field != value
field = value
if (changed) notifyListeners()
}

... and a dozen other properties that all follow this pattern ...
}

我想通过使用来简化它

class MyClass {
var a: Int by NotifyUiOnChange(42)

...

private inner class NotifyUiOnChange<T>(initialValue: T) : ObservableProperty<T>(initialValue) {
override fun afterChange(property: KProperty<*>, oldValue: T, newValue: T) {
notifyUiListeners()
}
}
}

但是 jackson 会忽略该属性。
无论如何,我如何告诉 jackson 序列化和反序列化该属性?
然后我该如何应用 @JsonIgnore 注释(或类似的东西)?

最佳答案

您必须在 Jackson 上使用过时的版本(或者可能是 Java 版本,而不是 Kotlin?)。我已经使用 "com.fasterxml.jackson.module:jackson-module-kotlin:2.10.+" 进行了检查(已解决至 2.10.1)。

我已经声明了两个类:

class MyClass {
var a: Int = 42
set(value) {
val changed = field != value
field = value
if (changed) notifyListener(field)
}

private fun notifyListener(field: Any?) {
println("changed: $field")
}
}

class MyDelegatedClass {
var a: Int by NotifyUi(42)

private inner class NotifyUi<T>(initialValue: T) : ObservableProperty<T>(initialValue) {
override fun afterChange(property: KProperty<*>, oldValue: T, newValue: T) {
notifyListener(newValue)
}
}

private fun notifyListener(field: Any?) {
println("changed: $field")
}
}


我的主要功能:
fun main() {
val noDelegate = MyClass()
val delegated = MyDelegatedClass()

val mapper = ObjectMapper().registerKotlinModule()

// Deserialization
val noDelegateValue = mapper.writeValueAsString(noDelegate)
val delegatedValue = mapper.writeValueAsString(delegated)

println("No delegate:\t$noDelegateValue")
println("With delegate\t$delegatedValue")

// Serialization
val noDelegateObject = mapper.readValue<MyClass>("{\"a\":42}".trimIndent())
val delegateObject = mapper.readValue<MyDelegatedClass>("{\"a\":42}".trimIndent())

}

输出:
No delegate:    {"a":42}
With delegate {"a":42}
changed: 42

当我们使用委托(delegate)属性时,我们甚至可以看到委托(delegate)的输出:)(我相信这是一个副作用,实际上应该被视为错误)

因此,处理代表是 jackson 的开箱即用功能(我不确定从什么时候开始,但我使用 lazy 代表和 jackson 在我曾经参与的旧项目中,代表没有问题)。

如何忽略委托(delegate)属性?

所以,你不能申请 JsonIgnore对委派字段的注释,因为您将获得 This annotation is not applicable to target 'member property with delegate' .但是,您可以定义应应用注释的范围。下面的例子:
class MyDelegateClass {
@get:JsonIgnore // or set:
val a: Int by NotifyUi(42)
}

不幸的是,它似乎有点坏了,因为你可以使用 get:set:它不仅适用于 getter 或 setter,而且适用于两者。

关于json - (de) 使用 jackson 序列化 kotlin 委托(delegate)属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59579738/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com