我们是一家拥有10+应用程序的公司,所有应用程序都使用10+内部SDK,所有这些都是在kotlin-android-extensions gradle插件的辉煌时期编写的。我们在很大程度上依赖于@Parcelize和合成绑定(我们所有的视图都是用它编写的)。
我们尝试将Kotlin版本从1.4.10升级到1.6.0,同时仍然使用kotlin-android-extensions插件。我们突然有一个报告here的@Parcelize错误,在Kotlin 1.5.0中修复。除了修复不在Kotlin本身,它在kotlin-parcelize插件中。当然,由于他们弃用了kotlin-android-extensions,因此后者不包含修复程序。所以简而言之,为了解决这个问题,我们必须使用kotlin-parcelize。
知道kotlin-parcelize不能用于kotlin-android-extensions (构建错误),并且将我们所有的视图从合成切换到视图绑定将是一项需要大量时间的地狱般的工作,这里能做什么呢?我们真的希望继续使用合成绑定,同时能够将Kotlin升级到其最新版本。
发布于 2021-12-04 19:47:44
看起来显而易见的选择是,您需要尽快从合成视图转移,尽管由于缺乏资源,这可能是不可能的。
老式方法
绕过Parcelable问题的一个解决方案是找出没有正确打包的类,并以一种老式的方式对它们进行序列化。
序列化到JSON
对于那些不起作用的,你可以提供以下可打包的实现,它将是通用的,并且可以绕过代码库:
使用这个通用函数,您可以将任何@Serializable对象写入到包中。
inline fun <reified T> writeToParcel(out: Parcel, data: T) {
val jsonString = Json.encodeToString(data)
out.writeInt(jsonString.length)
out.writeByteArray(jsonString.toByteArray())
}使用另一个对象,您应该能够反序列化这样的对象
inline fun <reified T> readFromParcel(input: Parcel): T {
val size = input.readInt()
val bytes = ByteArray(size) { input.readByte() }
val jsonString = bytes.toString()
return Json.decodeFromString<T>(jsonString)
}你可以使它们成为Parcel的扩展函数,以编写更少的代码。
这应该会让您绕过对Parcelize扩展有问题的类;它没有正确的Parcelable实现那么快,但是,嘿,它是有效的。
旁注
https://stackoverflow.com/questions/70228239
复制相似问题