android 如何区分序列化数据类和普通序列化类?

klh5stk1  于 2022-12-21  发布在  Android
关注(0)|答案(3)|浏览(157)

在为get data编写循环视图的代码时,我发现Kotlin中有一个data class
以下代码取自上述链接的两个不同项目。

@Serializable
data class MarsPhoto(
    val id: String,
    @SerialName(value = "img_src")
    val imgSrc: String
)
class Contacts {
    @SerializedName("country")
    private val country:String? = null

    fun getCountry():String?{
        return country
    }
}

我知道这两个类做的是同样的工作。那么它们之间有什么区别呢?我也想知道在MarsPhoto数据类中,它们如何在不像声明imgSrc那样声明SerialName的情况下获得id。(我现在才刚刚开始学习kotlin,所以我绝对是初学者)。

yqkkidmi

yqkkidmi1#

基本上,对于"data"类,编译器会自动从主构造函数中声明的所有属性派生以下成员:
等于()/哈希代码()对
格式为"MarsPhoto(id = 1,imgSrc = asdf)"的字符串
componentN()函数,这些函数按照属性的声明顺序与属性相对应。
复制()
您可以在enter link description here上阅读更多内容
在问题的SerializedName部分,如果你使用的是Gson lib,默认情况下,它会使用字段名作为"SerializedName"。只有当你想使用与字段名不同的名称时,你才可以使用SerializedName注解,并在那里传递你的自定义值。但通常情况下,每个人都只是写@SerializedName(),并将字段名的重复作为每个字段的值。
如果你正在从Json接收和序列化来自服务器的数据,这是一个好主意。因为后端开发人员可能会使用一个坏键作为响应,你不想在代码中使用这个键,所以@SerializedName将是你必须看到这个键的唯一位置,你可以随意命名你的字段。

hyrbngr7

hyrbngr72#

@Serializable用于将类标记为可序列化到磁盘或类似文件中(在Android中,替代方法是Parcel able),在进程死亡或配置更改的情况下特别有用,@SerializedName(“国家”)用于在您从服务器接收响应时进行json解析

raogr8fs

raogr8fs3#

您得到的id没有@SerializedName,因为JSON属性字段与变量名相同,但imgSrcimg_src不同。尽管如此,即使它们相同,您也应该始终使用@SerializedName,因为您的变量名可能在代码优化和混淆过程中转换为随机字母。

相关问题