使用GSON进行Kotlin对象反序列化

我有一堂课

class ThreadComment( banned: Int, closed: Int, comment: String?, date: String?, email: String?, files: ArrayList<File>?, lasthit: Int, name: String?, num: String?, op: Int, parent: String?, postsCount: Int, sticky: Int, subject: String?, tags: String?, timestamp: Int, trip: String?) : Comment(banned, closed, comment, date, email, files, lasthit, name, num, op, parent, postsCount, sticky, subject, tags, timestamp, trip) { val answers: ArrayList<String> = ArrayList()} 

父类看起来像

 open class Comment( @com.google.gson.annotations.SerializedName("banned") val banned: Int = 0, @com.google.gson.annotations.SerializedName("closed") val closed: Int = 0, @com.google.gson.annotations.SerializedName("comment") val comment: String? = null, @com.google.gson.annotations.SerializedName("date") val date: String? = null, @com.google.gson.annotations.SerializedName("email") val email: String? = null, @com.google.gson.annotations.SerializedName("files") val files: ArrayList<File>? = null, @com.google.gson.annotations.SerializedName("lasthit") val lasthit: Int = 0, @com.google.gson.annotations.SerializedName("name") val name: String? = null, @com.google.gson.annotations.SerializedName("num") val num: String? = null, @com.google.gson.annotations.SerializedName("op") val op: Int = 0, @com.google.gson.annotations.SerializedName("parent") val parent: String? = null, @com.google.gson.annotations.SerializedName("posts_count") val postsCount: Int = 0, @com.google.gson.annotations.SerializedName("sticky") val sticky: Int = 0, @com.google.gson.annotations.SerializedName("subject") val subject: String? = null, @com.google.gson.annotations.SerializedName("tags") val tags: String? = null, @com.google.gson.annotations.SerializedName("timestamp") val timestamp: Int = 0, @com.google.gson.annotations.SerializedName("trip") val trip: String? = null) : Serializable 

但是在用GSON进行反序列化之后,答案字段为空。 调试器

我也尝试将启动放入init {}中,但它仍然为null,通过lazy抛出一个有关在空对象引用上调用lazy.getValue的异常

正如在这个答案中所述, Gson可以不安全地处理无参数的构造方案。 它通过利用UnsafeAllocator来实现,而UnsafeAllocator反过来使用allocateInstanсe(Class p) 。 这意味着当没有无参数的构造函数,并且没有自定义的实例创建者注册时,由Gson创建的对象将具有使用声明的类型默认值初始化的字段

要解决,要么添加一个无参数构造函数即

 private constructor() : this(-1, -1, "", "", "", null, -1, "", "", -1, null, -1, -1, null, null, -1, null) 

或者将默认参数值添加到您的主构造函数中,如下所示:

 class ThreadComment( banned: Int = -1, closed: Int = -1, comment: String? = null, date: String? = null, email: String? = null, files: ArrayList<File>? = null, lasthit: Int = -1, name: String? = null, num: String? = null, op: Int = -1, parent: String? = null, postsCount: Int = -1, sticky: Int = -1, subject: String? = null, tags: String? = null, timestamp: Int = -1, trip: String? = null ) : Comment(banned, closed, comment, date, email, files, lasthit, name, num, op, parent, postsCount, sticky, subject, tags, timestamp, trip) { val answers: ArrayList<String> = ArrayList() } 

这很奇怪,我只是通常在Java中使用@SerializedName与数据类,它的工作原理:

 data class(@SerializedName("my_string_value") val myStringValue: String, @SerializedName("my_int_value") val myIntValue: Int)