为什么用序列化名称注释字段?

时间:2018-12-11 21:13:17

标签: android serialization

在分页代码实验室中有这段代码:

/**
 * Immutable model class for a Github repo that holds all the information about a repository.
 * Objects of this type are received from the Github API, therefore all the fields are annotated
 * with the serialized name.
 * This class also defines the Room repos table, where the repo [id] is the primary key.
 */
@Entity(tableName = "repos")
data class Repo(
        @PrimaryKey @field:SerializedName("id") val id: Long,
        @field:SerializedName("name") val name: String,
        @field:SerializedName("full_name") val fullName: String,
        @field:SerializedName("description") val description: String?,
        @field:SerializedName("html_url") val url: String,
        @field:SerializedName("stargazers_count") val stars: Int,
        @field:SerializedName("forks_count") val forks: Int,
        @field:SerializedName("language") val language: String?
)

为什么需要所有这些注释?他们做什么?

2 个答案:

答案 0 :(得分:0)

它们来自json形式的api。 json具有键值结构,其中具有名称和值,以便注释指示要查找的键,然后返回值,在这种情况下为长字符串和整数。我希望我足够清楚。 =)

答案 1 :(得分:0)

想象一下该数据库记录:

id: 21434366,
name: "John",
full_name: "John Doe",
number_of_github_repository: 4

每个字段的键均以小写字母,下划线分隔。但是,字段/变量的通用命名约定是基于驼峰大小写的。

不是将字段名本身用作变量名

val number_of_github_repository: Int 

我们都喜欢这个

val numOfGithubRepos: Int

这就是@field:SerializedName批注起作用的地方。如果用实际的数据库字段名对变量名进行注释,则程序将从已注释的名称中找到值,并将其分配给您的自定义变量名。

例如,

@field:SerializedName("number_of_github_repositories") val numOfGithubRepos: Int 

这将从数据库字段“ number_of_github_repositories”中查找值,并将其分配给变量numOfGithubRepos。

GSON库也是如此。它将不需要/无组织的字段名称转换为您首选的变量名称。默认情况下,GSON库尝试从Json响应中查找与声明的变量名称匹配的字段。因此,如果您只声明没有注释的字段,例如

val numOfGithubRepos: Int 

,如果实际的Json对象是

{num_of_github_repositories: 4}

它将抛出异常,因为Json响应中没有名称为numOfGithubRepos的字段。