使用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)