在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
.