自定义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
相关产品推荐
相关产品推荐

