为什么我的自定义日期类不可序列化

问题描述 投票:0回答:1

我当前的 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
android kotlin serialization
1个回答
0
投票

也许你可以试试这个

@Parcelize
@Serializable
data class MyDate internal constructor(
    val format: String,
    internal var date: LocalDate
) : Parcelable {
    // Your existing properties and methods remain the same.
}
© www.soinside.com 2019 - 2024. All rights reserved.