getSerializableExtra deprecated, What is the alternative?

Viewed 1570
6 Answers

method T getSerializableExtra(String, Class<T>) is introduced from android 33. so you shoud use an if block for devices using android below 33.

fun <T : Serializable?> getSerializable(activity: Activity, name: String, clazz: Class<T>): T
{
    return if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU)
               activity.intent.getSerializableExtra(name, clazz)!!
           else
               activity.intent.getSerializableExtra(name) as T
}

and then you can use it in your activity like this:

val myPOJOClass = getSerializable(this, "my_intent_key", MyPOJOClass::class.java)

This is what I use:

inline fun <reified T : Serializable> Bundle.serializable(key: String): T? = when {
  SDK_INT >= 33 -> getSerializable(key, T::class.java)
  else -> @Suppress("DEPRECATION") getSerializable(key) as? T
}

inline fun <reified T : Serializable> Intent.serializable(key: String): T? = when {
  SDK_INT >= 33 -> getSerializableExtra(key, T::class.java)
  else -> @Suppress("DEPRECATION") getSerializableExtra(key) as? T
}

I've also written the same for getParcelable here and requested this to be added to the Support libraries directly

However, Mohamad Seyedi's answer did the job. But it fails in the case of getting intent data from onActivityResult().

We can't get data using Activity's intent inside onActivityResult(). Below are the solutions I got.

Solution 1: Using extension function:

fun <T : Serializable?> Intent.getSerializable(key: String, m_class: Class<T>): T {
    return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU)
        this.getSerializableExtra(key, m_class)!!
    else
        this.getSerializableExtra(key) as T
}

Usage:

val myPOJOClass = intent.getSerializable("my_intent_key", MyPOJOClass::class.java)

Solution 2: Using regular function:

fun <T : Serializable?> getSerializable(intent: Intent, key: String, m_class: Class<T>): T {
    return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU)
        intent.getSerializableExtra(key, m_class)!!
    else
        intent.getSerializableExtra(key) as T
}

Usage:

val myPOJOClass = getSerializable(intent, "my_intent_key", MyPOJOClass::class.java)

Haven't used it myself till yet . As the doc says the updated method is

T getSerializableExtra(String, Class<T>) So you can use it as follows i think.

val myPOJOClass = intent.getSerializableExtra("my_intent_key", MyPOJOClass::class.java)

Inspired by Mohamad's answer, you can do an extension

fun <T : Serializable?> Bundle.getSerializableCompat(key: String, clazz: Class<T>): T {
    return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) getSerializable(key, clazz)!! else (getSerializable(key) as T)
}

and call it everywhere like this:

   arguments?.getSerializableCompat("my_key", MyClass::class.java)

    val myPojoClass = getSerializable(intent, "key_name_here", MyPojoTypeClass::class.java)

then, create that function

 private fun <T : Serializable?> getSerializable(intent: Intent, key: String, className: Class<T>): T {
        return if (Build.VERSION.SDK_INT >= 33)
            intent.getSerializableExtra(key, className)!!
        else
            intent.getSerializableExtra(key) as T
    }

Related