You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Gson序列化Kotlin委托时成员未被序列化的解决咨询

这个问题我之前也碰到过,本质是Gson默认的序列化逻辑和Kotlin委托属性的编译实现不兼容导致的:Kotlin的委托属性编译后会生成一个像myProp$delegate这样的隐藏幕后字段,而Gson默认是直接反射类的字段来序列化,不会主动调用属性的getter方法,所以你的委托属性值就被忽略了。

不用写自定义序列化器的话,最简单的解决方案就是给委托属性的getter加个注解:

给委托属性添加@get:SerializedName注解

直接在委托属性的getter上标注@SerializedName,明确告诉Gson这个getter对应的JSON字段名,这样Gson就会主动调用getter获取委托返回的值并序列化进去。

举个完整的示例:

import com.google.gson.annotations.SerializedName
import com.google.gson.Gson
import kotlin.properties.ReadWriteProperty
import kotlin.reflect.KProperty

class MyDelegate {
    fun observableDelegate(onChange: () -> Unit): ReadWriteProperty<Any?, String> {
        return object : ReadWriteProperty<Any?, String> {
            private var internalValue = "myDelegate Property"
            
            override fun getValue(thisRef: Any?, property: KProperty<*>): String {
                return internalValue
            }
            
            override fun setValue(thisRef: Any?, property: KProperty<*>, value: String) {
                internalValue = value
                onChange()
            }
        }
    }
}

class MyClass {
    // 重点:给委托属性的getter添加@SerializedName注解
    var myProp by MyDelegate().observableDelegate {
        println("Property changed!")
    }
        @get:SerializedName("myProp")
}

fun main() {
    val gson = Gson()
    val myObj = MyClass()
    println(gson.toJson(myObj)) // 输出:{"myProp":"myDelegate Property"}
}

这个方案只需要加一行注解,完全不用修改Gson的核心配置,也不用写任何自定义序列化逻辑,完美符合你的需求。

另外需要注意:如果你的委托属性是private的,要确保getter是public的(Kotlin默认属性的getter就是public的,所以一般不用额外处理),这样Gson才能正常访问到getter方法获取值。

内容的提问来源于stack exchange,提问作者Gary Bak

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:21:48