使用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
相关产品推荐
相关产品推荐

