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

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

概述在Kotlin中,您可以创建一个数据类:dataclassCountriesResponse(valcount:Int,valcountries:List<Country>,valerror:String)然后您可以使用它来解析JSON,例如“{n:10}”.在这种情况下,您将拥有一个对象val国家:CountriesResponse,从Retrofit,Fuel或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.

总结

以上是内存溢出为你收集整理的android – 为什么Kotlin数据类在Gson的非可空字段中可以有空值?全部内容,希望文章能够帮你解决android – 为什么Kotlin数据类在Gson的非可空字段中可以有空值?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1116493.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-29
下一篇 2022-05-29

发表评论

登录后才能评论

评论列表(0条)

保存