Search code examples
androidkotlinserializationbundlekotlinx

Is there a way to use Kotlinx serialisation in an Android savedInstanceState Bundle?


It looks like the compiler doesn't want to use Kotlinx serialized classes in putSerializable and getSerializable. It says Type mismatch: inferred type is MyViewModel.SavedState but Serializable? was expected.

In my Activity:

override fun onCreate(savedInstanceState: Bundle?) {
    AndroidInjection.inject(this)
    super.onCreate(savedInstanceState)

    setContentView(R.layout.my_activity_layout)

    viewModel.init(savedInstanceState?.getSerializable(SAVE_STATE) as? SavedState) // compiler complains here
}

override fun onSaveInstanceState(outState: Bundle) {
    super.onSaveInstanceState(outState)
    outState.putSerializable(SAVE_STATE, viewModel.buildSaveState()) // and here
}

In my ViewModel:

fun buildSaveState(): SavedState =
        SavedState(value1, value2, value3, value4)

@Serializable
data class SavedState(val foo: Boolean?,
                      val foo1: Enum1?,
                      val foo2: Enum2?,
                      val foo3: MyType?)

MyType:

@Serializable
sealed class MyType {
    data class MyType1(val foo4: Enum3) : MyType()
    data class MyType2(val foo5: Enum4) : MyType()

    enum class Enum3 {
        ...
    }

    enum class Enum4 {
        ...
    }
}

Solution

  • I'm pretty sure Kotlinx.Serialization is not OOB compatible with Bundle's putSerializable. However, you could just stringify your SavedState, send it via putString and on the receiving end deserialize string back to your class.