android – 为什么Kotlin数据类在Gson的非可空字段中可以有空值?

在Kotlin中,您可以创建一个数据类:

data class CountriesResponse(
    val count: Int,
    val countries: List<Country>,
    val error: String)

然后您可以使用它来解析JSON,例如“{n:10}”.在这种情况下,您将拥有一个对象val国家:CountriesResponse,从Retrofit,Fuel或Gson接收,包含以下值:count = 0,countries = null,error = null.

Kotlin + Gson – How to get an emptyList when null for data class中,您可以看到另一个示例.

当您稍后尝试使用国家/地区时,您将在此处获得一个例外:val size = countries.countries.size:“kotlin.TypeCastException:null无法转换为非null类型kotlin.Int”.如果你编写代码并使用?访问这些字段时,Android Studio会突出显示?并警告:对List< Country>类型的非null接收器进行不必要的安全调用.

那么,我们应该使用吗?在数据类?为什么应用程序在运行时期间可以将null设置为非可空变量?

解决方法:

发生这种情况是因为Gson使用不安全(如在java.misc.Unsafe中)实例构造机制来创建类的实例,绕过它们的构造函数,然后直接设置它们的字段.

有关研究,请参阅此Q& A:Gson Deserialization with Kotlin, Initializer block not called.

因此,Gson忽略了构造逻辑和类状态不变量,因此不建议将它用于可能受此影响的复杂类.它也忽略了setter中的值检查.

考虑一个Kotlin感知的序列化解决方案,例如Jackson(在上面链接的Q& A中提到)或kotlinx.serialization.

上一篇:java – 无法解释NullPointerException


下一篇:更新地图时Android谷歌地图上的NullPointer异常