Toe*_*Lie 10 serialization annotations gson kotlin
通常,我使用@SerializedName注释来映射 JSON 字段。但是,在 Google Architecture Component 示例项目中,我看到他们使用了@field:SerializedName注释,但我找不到任何地方可以了解使用该@field注释的目的。
我是 Kotlin 的新手,有人可以解释或分享要阅读的参考链接吗?谢谢你。
@Entity(
indices = [
Index("id"),
Index("owner_login")],
primaryKeys = ["name", "owner_login"]
)
data class Repo(
val id: Int,
@field:SerializedName("name")
val name: String,
@field:SerializedName("full_name")
val fullName: String,
@field:SerializedName("description")
val description: String?,
@field:SerializedName("owner")
@field:Embedded(prefix = "owner_")
val owner: Owner,
@field:SerializedName("stargazers_count")
val stars: Int
) {...
Run Code Online (Sandbox Code Playgroud)
Sla*_*law 11
为简化起见,假设您有:
data class Repo(
@field:SerializedName("name")
var name: String
)
Run Code Online (Sandbox Code Playgroud)
这是声明一个数据类并在主构造函数中声明该类的属性。Kotlin 属性被编译成一个字段、getter 方法和——如果是可变的(即)——一个 setter 方法。由于属性是在主构造函数中声明的,因此它也被编译为构造函数的参数。这一切意味着在这个上下文中有很多地方可以放置注解:Kotlin 属性、支持字段、getter 方法、构造函数参数、setter 方法或 setter 参数。这使得注释将应用于属性的支持字段。从文档:varfield:
#Annotation 使用站点目标
注释属性或主构造函数参数时,会从相应的 Kotlin 元素生成多个 Java 元素,因此生成的 Java 字节码中有多个可能的注释位置。要指定应如何准确生成注释,请使用以下语法:
Run Code Online (Sandbox Code Playgroud)class Example(@field:Ann val foo, // annotate Java field @get:Ann val bar, // annotate Java getter @param:Ann val quux) // annotate Java constructor parameter可以使用相同的语法来注释整个文件。为此,请
file在文件的顶层、包指令之前或所有导入之前(如果文件在默认包中)放置带有目标的注释:Run Code Online (Sandbox Code Playgroud)@file:JvmName("Foo") package org.jetbrains.demo如果您有多个注释具有相同的目标,则可以通过在目标后添加括号并将所有注释放在括号内来避免重复目标:
Run Code Online (Sandbox Code Playgroud)class Example { @set:[Inject VisibleForTesting] var collaborator: Collaborator }支持的使用站点目标的完整列表是:
file;property(带有此目标的注释对 Java 不可见);field;get(属性吸气剂);set(财产继承人);receiver(扩展函数或属性的接收器参数);param(构造函数参数);setparam(属性设置器参数);delegate(存储委托属性的委托实例的字段)。要注释扩展函数的接收器参数,请使用以下语法:
Run Code Online (Sandbox Code Playgroud)fun @receiver:Fancy String.myExtension() { ... }如果未指定使用站点目标,则根据
@Target正在使用的注释的注释选择目标。如果有多个适用目标,则使用以下列表中的第一个适用目标:
param;property;field.
虽然在这种情况下使用并不是不正确@field:SerializedName(...),但没有必要:添加或不添加都会生成相同的字节码field:,因为无论哪种方式,只有私有支持字段才会获得注释。我从来没有见过任何实际的项目愿意@field:SerializedName这样做@SerializedName,而且我认为 Google 示例的使用对初学者来说是不必要的困惑。您应该随意忽略它。
小智 5
这可能会有所帮助:来自 kotlin 文档
注释属性或主构造函数参数时,会从相应的 Kotlin 元素生成多个 Java 元素,因此生成的 Java 字节码中有多个可能的注释位置。要指定应如何准确生成注释,请使用以下语法:
class Example(@field:Ann val foo, // annotate Java field
@get:Ann val bar, // annotate Java getter
@param:Ann val quux) // annotate Java constructor parameter
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2324 次 |
| 最近记录: |