'Error "Parcelable encountered IOException reading a Serializable object"

I created a navigation system to navigate to correct fragment based on Destination object which I send with Intent as Parcelable extra

@Serializable
sealed class Destination : Parcelable {

    abstract val destinationType: Type

    abstract val destinationFragment: Fragment

    enum class Type(val defaultDestination: Destination) {
        DASHBOARD(Dashboard),
        GRADE(Grade),
        ATTENDANCE(Attendance),
        EXAM(Exam),
        TIMETABLE(Timetable()),
        HOMEWORK(Homework),
        NOTE(Note),
        CONFERENCE(Conference),
        SCHOOL_ANNOUNCEMENT(SchoolAnnouncement),
        SCHOOL(School),
        LUCKY_NUMBER(More),
        MORE(More),
        MESSAGE(Message);
    }

    @Parcelize
    @Serializable
    object Dashboard : Destination() {
        override val destinationType get() = Type.DASHBOARD
        override val destinationFragment get() = DashboardFragment.newInstance()
    }

    @Parcelize
    @Serializable
    object Grade : Destination() {
        override val destinationType get() = Type.GRADE
        override val destinationFragment get() = GradeFragment.newInstance()
    }

    @Parcelize
    @Serializable
    object Attendance : Destination() {
        override val destinationType get() = Type.ATTENDANCE
        override val destinationFragment get() = AttendanceFragment.newInstance()
    }

    @Parcelize
    @Serializable
    object Exam : Destination() {
        override val destinationType get() = Type.EXAM
        override val destinationFragment get() = ExamFragment.newInstance()
    }

    @Parcelize
    @Serializable
    data class Timetable(
        @Serializable(with = LocalDateSerializer::class)
        private val date: LocalDate? = null
    ) : Destination() {
        override val destinationType get() = Type.TIMETABLE
        override val destinationFragment get() = TimetableFragment.newInstance(date)
    }

    @Parcelize
    @Serializable
    object Homework : Destination() {
        override val destinationType get() = Type.HOMEWORK
        override val destinationFragment get() = HomeworkFragment.newInstance()
    }

    @Parcelize
    @Serializable
    object Note : Destination() {
        override val destinationType get() = Type.NOTE
        override val destinationFragment get() = NoteFragment.newInstance()
    }

    @Parcelize
    @Serializable
    object Conference : Destination() {
        override val destinationType get() = Type.CONFERENCE
        override val destinationFragment get() = ConferenceFragment.newInstance()
    }

    @Parcelize
    @Serializable
    object SchoolAnnouncement : Destination() {
        override val destinationType get() = Type.SCHOOL_ANNOUNCEMENT
        override val destinationFragment get() = SchoolAnnouncementFragment.newInstance()
    }

    @Parcelize
    @Serializable
    object School : Destination() {
        override val destinationType get() = Type.SCHOOL
        override val destinationFragment get() = SchoolFragment.newInstance()
    }

    @Parcelize
    @Serializable
    object LuckyNumber : Destination() {
        override val destinationType get() = Type.LUCKY_NUMBER
        override val destinationFragment get() = LuckyNumberFragment.newInstance()
    }

    @Parcelize
    @Serializable
    object More : Destination() {
        override val destinationType get() = Type.MORE
        override val destinationFragment get() = MoreFragment.newInstance()
    }

    @Parcelize
    @Serializable
    object Message : Destination() {
        override val destinationType get() = Type.MESSAGE
        override val destinationFragment get() = MessageFragment.newInstance()
    }
}

This works perfectly on my devices. I released an app to the Google Play store. I noticed later in Firebase that a small part of users have this error

Fatal Exception: java.lang.RuntimeException: Unable to start activity ComponentInfo{io.github.wulkanowy/io.github.wulkanowy.ui.modules.splash.SplashActivity}: java.lang.RuntimeException: Parcelable encountered IOException reading a Serializable object (name = io.github.wulkanowy.ui.modules.Destination$Exam)
       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3477)
       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3620)
       at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
       at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
       at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2183)
       at android.os.Handler.dispatchMessage(Handler.java:107)
       at android.os.Looper.loop(Looper.java:241)
       at android.app.ActivityThread.main(ActivityThread.java:7604)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:941)
    Caused by java.lang.RuntimeException: Parcelable encountered IOException reading a Serializable object (name = io.github.wulkanowy.ui.modules.Destination$Exam)
       at android.os.Parcel.readSerializable(Parcel.java:3136)
       at android.os.Parcel.readValue(Parcel.java:2917)
       at android.os.Parcel.readArrayMapInternal(Parcel.java:3244)
       at android.os.BaseBundle.initializeFromParcelLocked(BaseBundle.java:292)
       at android.os.BaseBundle.unparcel(BaseBundle.java:236)
       at android.os.Bundle.getBundle(Bundle.java:924)
       at com.google.firebase.messaging.FcmLifecycleCallbacks.logNotificationOpen(FcmLifecycleCallbacks.java:79)
       at com.google.firebase.messaging.FcmLifecycleCallbacks.onActivityCreated(FcmLifecycleCallbacks.java:49)
       at android.app.Application.dispatchActivityCreated(Application.java:373)
       at android.app.Activity.dispatchActivityCreated(Activity.java:1206)
       at android.app.Activity.onCreate(Activity.java:1479)
       at androidx.core.app.ComponentActivity.onCreate(ComponentActivity.java:85)
       at androidx.activity.ComponentActivity.onCreate(ComponentActivity.java:321)
       at androidx.fragment.app.FragmentActivity.onCreate(FragmentActivity.java:249)
       at io.github.wulkanowy.ui.base.BaseActivity.onCreate(BaseActivity.kt:38)
       at io.github.wulkanowy.ui.modules.splash.SplashActivity.onCreate(SplashActivity.kt:44)
       at android.app.Activity.performCreate(Activity.java:7822)
       at android.app.Activity.performCreate(Activity.java:7811)
       at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1328)
       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3452)
       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3620)
       at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
       at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
       at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2183)
       at android.os.Handler.dispatchMessage(Handler.java:107)
       at android.os.Looper.loop(Looper.java:241)
       at android.app.ActivityThread.main(ActivityThread.java:7604)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:941)
Caused by java.io.InvalidClassException: io.github.wulkanowy.ui.modules.Destination$Exam; class invalid for deserialization
       at java.io.ObjectStreamClass$ExceptionInfo.newInvalidClassException(ObjectStreamClass.java:154)
       at java.io.ObjectStreamClass.checkDeserialize(ObjectStreamClass.java:798)
       at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1873)
       at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1412)
       at java.io.ObjectInputStream.readObject(ObjectInputStream.java:427)
       at android.os.Parcel.readSerializable(Parcel.java:3134)
       at android.os.Parcel.readValue(Parcel.java:2917)
       at android.os.Parcel.readArrayMapInternal(Parcel.java:3244)
       at android.os.BaseBundle.initializeFromParcelLocked(BaseBundle.java:292)
       at android.os.BaseBundle.unparcel(BaseBundle.java:236)
       at android.os.Bundle.getBundle(Bundle.java:924)
       at com.google.firebase.messaging.FcmLifecycleCallbacks.logNotificationOpen(FcmLifecycleCallbacks.java:79)
       at com.google.firebase.messaging.FcmLifecycleCallbacks.onActivityCreated(FcmLifecycleCallbacks.java:49)
       at android.app.Application.dispatchActivityCreated(Application.java:373)
       at android.app.Activity.dispatchActivityCreated(Activity.java:1206)
       at android.app.Activity.onCreate(Activity.java:1479)
       at androidx.core.app.ComponentActivity.onCreate(ComponentActivity.java:85)
       at androidx.activity.ComponentActivity.onCreate(ComponentActivity.java:321)
       at androidx.fragment.app.FragmentActivity.onCreate(FragmentActivity.java:249)
       at io.github.wulkanowy.ui.base.BaseActivity.onCreate(BaseActivity.kt:38)
       at io.github.wulkanowy.ui.modules.splash.SplashActivity.onCreate(SplashActivity.kt:44)
       at android.app.Activity.performCreate(Activity.java:7822)
       at android.app.Activity.performCreate(Activity.java:7811)
       at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1328)
       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3452)
       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3620)
       at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
       at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
       at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2183)
       at android.os.Handler.dispatchMessage(Handler.java:107)
       at android.os.Looper.loop(Looper.java:241)
       at android.app.ActivityThread.main(ActivityThread.java:7604)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:941)

I can't reproduce this error on my devices or on android emulator.

Link to the app's github repository https://github.com/wulkanowy/wulkanowy



Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source