Java 使用gson和back序列化不适用于泛型类型

Java 使用gson和back序列化不适用于泛型类型,java,json,gson,kotlin,dto,Java,Json,Gson,Kotlin,Dto,我正在编写一个kotlin websocket,希望通过gson将DTO转换为json。因此,我编写了一种包装器dto,它包含真实的dto和一些关于dto的附加信息,比如它的类型。这是我的包装袋 class WrapperDto <T : AbstractDto> { var type = "" var action = "" var dto : T = AbstractDto() as T } 出于测试原因,我尝试将其转换为json并再次转换: v

我正在编写一个kotlin websocket,希望通过gson将DTO转换为json。因此,我编写了一种包装器dto,它包含真实的dto和一些关于dto的附加信息,比如它的类型。这是我的包装袋

class WrapperDto <T : AbstractDto> {
    var type = ""
    var action = ""
    var dto : T = AbstractDto() as T
}
出于测试原因,我尝试将其转换为json并再次转换:

    val wrapperDto2 = WrapperDto<Person>()
    wrapperDto2.type = Person::class.simpleName!!;
    wrapperDto2.action = "add"
    val person = Person()
    person.firstName = "Richard"
    person.familyName = "Lederer"
    wrapperDto2.dto = person;

    val gson1 = Gson()
    val toJson = gson1.toJson(wrapperDto2)
    println("to json: "  + toJson)
    val fromJson = gson1.fromJson(toJson, wrapperDto2::class.java)
    println("from json: " + fromJson)
我怎样才能解决这个问题

这是由于。您需要使用在运行时检索类型信息

val fromJson = gson1.fromJson<WrapperDto<Person>>(toJson, object: TypeToken<WrapperDto<Person>>() {}.type)
java.lang.IllegalArgumentException: Can not set at.richardlederer.contactmanager.dto.AbstractDto field at.richardlederer.contactmanager.dto.WrapperDto.dto to com.google.gson.internal.LinkedTreeMap
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:167)
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:171)
at sun.reflect.UnsafeObjectFieldAccessorImpl.set(UnsafeObjectFieldAccessorImpl.java:81)
val fromJson = gson1.fromJson<WrapperDto<Person>>(toJson, object: TypeToken<WrapperDto<Person>>() {}.type)
inline fun <reified T> fromJson(json: String): T = Gson().fromJson<T>(json, object: TypeToken<T>() {}.type)
val fromJson = fromJson<WrapperDto<Person>>(toJson)
//Or
val fromJson: WrapperDto<Person> = fromJson(toJson)    //Type inferred