早期版本的 Moshi 不支持“codegen”,因此它们完全依赖于反射(即在运行时内省类的能力)。但是,对于需要非常高性能的应用程序来说,这可能是一个问题,因此他们添加了利用注释处理的“代码生成”功能。基本上这允许在编译时生成代码,因此它们可以在不使用反射的情况下执行序列化/反序列化。
为了启用代码生成功能,您还需要启用 Kapt,它是 Kotlin 注释处理器,否则不会发生注释处理。
Here 您将了解如何启用和配置 Kapt,here 您将了解如何设置 Moshi 代码生成依赖项。
编辑
在您添加到问题的代码的 sn-p 中,Moshi 使用 ClassJsonAdapter 序列化您的对象。该适配器利用反射来查找所有字段并创建 JSON 字符串(您可以看到该类从 java.lang.reflect 导入内容)。
另一方面,Moshi 代码生成为您的类生成一个 JsonAdapter。例如,让 Moshi 为您的 Person 类创建适配器将生成以下内容:
// Code generated by moshi-kotlin-codegen. Do not edit.
import com.squareup.moshi.JsonAdapter
import com.squareup.moshi.JsonDataException
import com.squareup.moshi.JsonReader
import com.squareup.moshi.JsonWriter
import com.squareup.moshi.Moshi
import java.lang.NullPointerException
import kotlin.String
class PersonJsonAdapter(moshi: Moshi) : JsonAdapter<Person>() {
private val options: JsonReader.Options = JsonReader.Options.of("name")
private val stringAdapter: JsonAdapter<String> =
moshi.adapter<String>(String::class.java, kotlin.collections.emptySet(), "name")
override fun toString(): String = "GeneratedJsonAdapter(Person)"
override fun fromJson(reader: JsonReader): Person {
var name: String? = null
reader.beginObject()
while (reader.hasNext()) {
when (reader.selectName(options)) {
0 -> name = stringAdapter.fromJson(reader) ?: throw JsonDataException("Non-null value 'name' was null at ${reader.path}")
-1 -> {
// Unknown name, skip it.
reader.skipName()
reader.skipValue()
}
}
}
reader.endObject()
var result = Person(
name = name ?: throw JsonDataException("Required property 'name' missing at ${reader.path}"))
return result
}
override fun toJson(writer: JsonWriter, value: Person?) {
if (value == null) {
throw NullPointerException("value was null! Wrap in .nullSafe() to write nullable values.")
}
writer.beginObject()
writer.name("name")
stringAdapter.toJson(writer, value.name)
writer.endObject()
}
}
因此,当您请求Person 的适配器时,Moshi 将使用生成的PersonJsonAdapter 而不是ClassJsonAdapter。
奖金
Moshi uses reflection to instantiate the generated adapter(然后被缓存,以便下次您请求同一类的适配器时可以重用它),因此如果您想使用,则根本不需要添加任何额外的代码代码生成功能。