Android 13(SDK 33):Bundle.getSerializable(String)已被弃用,有什么替代方法?

20

从API级别33开始,Bundle类的getSerializable(String)方法已被弃用。文档建议改用getSerializable(String,Class)方法。但是这个函数只在API级别33及以上可用。

我的当前代码:

val model = args.getSerializable("key") as? Model

现在应该是这样吗?

val model = args.customGetSerializable<Model>("key")

@Suppress("DEPRECATION")
inline fun <reified T : Serializable> Bundle.customGetSerializable(key: String): T? {
    return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
        getSerializable(key, T::class.java)
    } else {
        getSerializable(key) as? T
    }
}

一个好点。也许还可以使用 Parcelable - CoolMind
好的建议。实际上我正在为更多的其他模型使用Parcelable。在这种情况下,上面的代码片段实际上是用于枚举,所以示例中的“Model”是一个枚举。你对此有什么看法?我应该坚持使用上面的代码还是用这个 https://dev59.com/AWYr5IYBdhLWcg3wy9OA#13385129 替换它? - Marat
Parcelable 可以替代 Serializable,即使是对于 Enum 也是如此。 - CoolMind
@CoolMind 更好的建议是:避免传递足够大以使得 SerializableParcelable 之间有意义区别的对象。 - Agent_L
@Agent_L,我同意你的观点。 - CoolMind
3个回答

7

这是现在的标准做法吗?

是的。

理想情况下,Google 会为这些变化添加到 BundleCompat,或许现在随着 Android 13 开始向用户发布,他们会这样做。


6
已经有一个“BundleCompat的功能请求”(https://issuetracker.google.com/issues/242048899),但评论中指向了此问题(https://issuetracker.google.com/issues/240585930),该问题表明新API可能会崩溃,并带有“NullPointerException”,这意味着在Android U之前使用新API实际上可能并不安全。 - ianhanniballake

1
提供了很多关于Kotlin的示例和解决方案,但似乎Java并没有得到任何进展。下面是一个可行的Java解决方案:
List<ClassName> variable;
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
    //noinspection unchecked
    Class<? extends ArrayList<ClassName>> type = (Class<? extends ArrayList<ClassName>>) new ArrayList<>().getClass();
    variable = bundle.getSerializable("reference", type);
} else {
    //noinspection unchecked,deprecation
    variable = (List<ClassName>) bundle.getSerializable("reference");
}

0
你可以做的是将你的枚举设置为Parcelable。使用@Parcelize注解可以很容易地实现这一点。
之后,你可以用BundleCompat.getParcelable()替换你已经过时的getSerializable()方法。
但是当你调用putExtra()方法时需要注意,因为你的枚举现在同时实现了Serializable和Parcelable接口,所以你需要强制将枚举作为Parcelable类型传递,像这样putExtra(enum as Parcelable)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接