我当前的 Android 应用程序中有以下自定义日期类
import kotlinx.datetime.LocalDate
import kotlinx.datetime.format
import kotlinx.serialization.Serializable
import shared.dates.MyDateFormatterFactory.createFormatter
import kotlin.properties.Delegates
@Serializable
data class MyDate internal constructor(
val format: String,
internal var date: LocalDate
) {
val string get() = _stringRepresentation
private val formatter = createFormatter(format)
private var _stringRepresentation by Delegates.observable(date.format(formatter)) { _, _, newValue ->
date = LocalDate.parse(newValue, formatter)
}
internal var internalDate by Delegates.observable(date) { _, oldValue, newValue ->
if (newValue != oldValue) {
date = newValue
_stringRepresentation = date.format(formatter)
}
}
fun set(newDate: String) {
_stringRepresentation = newDate
}
override fun toString() = _stringRepresentation
}
当我尝试将其作为参数传递给 Activity 时,我收到以下运行时异常
FATAL EXCEPTION: main (Ask Gemini)
Process: com.squareup.timessquare.sample, PID: 27037
java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = organisation.research.daily.FrankArgs)
at android.os.Parcel.writeSerializable(Parcel.java:2126)
at android.os.Parcel.writeValue(Parcel.java:1896)
at android.os.Parcel.writeArrayMapInternal(Parcel.java:988)
at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1620)
at android.os.Bundle.writeToParcel(Bundle.java:1303)
at android.os.Parcel.writeBundle(Parcel.java:1057)
at android.content.Intent.writeToParcel(Intent.java:11512)
at android.app.IActivityTaskManager$Stub$Proxy.startActivity(IActivityTaskManager.java:4248)
at android.app.Instrumentation.execStartActivity(Instrumentation.java:1723)
at android.app.Activity.startActivityForResult(Activity.java:5377)
at androidx.activity.ComponentActivity.startActivityForResult(ComponentActivity.kt:704)
at android.app.Activity.startActivityForResult(Activity.java:5335)
at androidx.activity.ComponentActivity.startActivityForResult(ComponentActivity.kt:683)
at android.app.Activity.startActivity(Activity.java:5721)
at android.app.Activity.startActivity(Activity.java:5674)
at organisation.uikit.core.extensions.IntentExtensionsKt.startActivity(IntentExtensions.kt:16)
at organisation.research.daily.AFrank$Companion.invoke(AFrank.kt:1148)
at organisation.research.module.routing.ModuleRunner.startFrankProject$lambda$5(ModuleRunner.kt:140)
at organisation.research.module.routing.ModuleRunner.$r8$lambda$TpjcOuyCuzL1feKmvclHTm30cjY(Unknown Source:0)
at organisation.research.module.routing.ModuleRunner$$ExternalSyntheticLambda5.invoke(D8$$SyntheticClass:0)
at organisation.research.module.routing.ModuleRunner$preventModuleMissingAreFile$1.invokeSuspend(ModuleRunner.kt:358)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:104)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:246)
at android.app.ActivityThread.main(ActivityThread.java:8653)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130)
Suppressed: kotlinx.coroutines.internal.DiagnosticCoroutineContextException: [StandaloneCoroutine{Cancelling}@9473510, Dispatchers.Main]
Caused by: java.io.NotSerializableException: shared.dates.MyDate
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1240)
at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1604)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1565)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1488)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1234)
at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1604)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1565)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1488)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1234)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:354)
at android.os.Parcel.writeSerializable(Parcel.java:2121)
... 29 more
问题是什么? MyDate 必须将一个值设为 String,另一个值设为 kotlinx.datetime.LocalDate,它们本身都是可序列化的。
为什么 MyDate 数据类不可序列化?
问题是由Delegates.observable两者造成的吗?
当我用实现 java.io.Serialized 替换 @Serializable 时,我得到以下异常
Caused by: java.io.NotSerializableException: shared.dates.MyDate$special$$inlined$observable$1
也许你可以试试这个
@Parcelize
@Serializable
data class MyDate internal constructor(
val format: String,
internal var date: LocalDate
) : Parcelable {
// Your existing properties and methods remain the same.
}