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

自定义MyDate类无法序列化问题排查求助

问题根源与解决方案

第一个异常的原因:Kotlinx序列化与Java序列化不兼容

Android的Intent传递对象依赖Java原生序列化机制(要求类实现java.io.Serializable接口),而你使用的@Serializable是Kotlinx Serialization库的专属注解——这个注解仅服务于Kotlin自身的序列化框架,和Java序列化体系完全不互通。因此即便加了该注解,Android的Intent系统依然会判定你的类未满足Java序列化要求,抛出NotSerializableException。

第二个异常的根源:Delegates.observable的委托对象不可序列化

当你让类实现java.io.Serializable后,问题出在Delegates.observable上:

  • Delegates.observable返回的内部委托对象没有实现java.io.Serializable接口。
  • Java序列化机制会递归序列化类的所有成员,包括这个委托对象,由于它不可序列化,直接触发序列化异常。
  • 哪怕你的属性(String、kotlinx.datetime.LocalDate)本身可序列化,只要属性绑定了不可序列化的委托,整个类的序列化都会失败。

解决方案

  • 替换为可序列化的Observable委托:
    若需保留属性监听逻辑,可自行实现一个实现了java.io.Serializable的Observable委托,示例代码:
    class SerializableObservableDelegate<T>(
        initialValue: T,
        private val onChange: (property: KProperty<*>, oldValue: T, newValue: T) -> Unit
    ) : ReadWriteProperty<Any?, T>, Serializable {
        private var value = initialValue
    
        override fun getValue(thisRef: Any?, property: KProperty<*>): T = value
    
        override fun setValue(thisRef: Any?, property: KProperty<*>, value: T) {
            val oldValue = this.value
            this.value = value
            onChange(property, oldValue, value)
        }
    }
    
    // 使用方式
    var myProperty by SerializableObservableDelegate(initialValue) { property, old, new ->
        // 你的监听逻辑
    }
    
  • 改用Parcelable(推荐):
    Android传递对象更推荐Parcelable,效率远高于Java序列化。可手动实现Parcelable,或用Kotlin的@Parcelize注解(需在Gradle中启用相关插件)自动生成实现,注意同样要确保属性委托支持Parcelable,或替换不可Parcelable的委托。
  • 移除Delegates.observable:
    若监听逻辑非必需,直接改用普通属性,类的序列化即可正常工作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 17:04:53