Почему мой пользовательский класс даты не сериализуетсяAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Почему мой пользовательский класс даты не сериализуется

Сообщение Anonymous »

В моем текущем приложении для 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
}

когда я пытаюсь передать его в качестве аргументов в действие, я получаю следующее исключение во время выполнения
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 должен быть vals, один из них — String, другой — kotlinx.datetime.LocalDate, оба из которых сериализуемы сами по себе.
почему класс данных MyDate не сериализуем?
проблема вызвана этими двумя Delegates.observable?
Когда я заменяю @Serializable внедрением java.io.Serializable, я получаю следующее исключение
Caused by: java.io.NotSerializableException: shared.dates.MyDate$special$$inlined$observable$1


Подробнее здесь: https://stackoverflow.com/questions/790 ... rialisable
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»