使用gson序列化和返回不适用于泛型类型

我正在编程一个kotlin websocket,并想发送转换为jsongsondtos。 所以我写了一个包装dto包含真正的dto和dto的一些额外的信息,就像它的类型。 这是我的包装dto

class WrapperDto <T : AbstractDto> { var type = "" var action = "" var dto : T = AbstractDto() as T } 

这是它可以包含的dtos之一:

 class Person : AbstractDto() { var firstName = "" var familyName = "" } 

在这里出于测试的原因,我尝试将其转换为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) 

最后一个println从来没有被调用,我得到以下错误信息:

 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) 

我该如何解决这个问题?

One Solution collect form web for “使用gson序列化和返回不适用于泛型类型”

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

 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) 

那么,你可以这样叫fromJson

 val fromJson = fromJson<WrapperDto<Person>>(toJson) //Or val fromJson: WrapperDto<Person> = fromJson(toJson) //Type inferred 
  • 在kotlin使用房间作为单身人士
  • 如何序列化/反序列化Kotlin中的自定义对象数组?
  • 在JavaFX TableView中平滑滚动
  • 如何在基本types中使用kotlin中的@Autowired或@Value等Spring注解?
  • 在Kotlin或Java中,如何判断一个数是否是10的幂数?
  • 我可以通过在Java代码中使用它们来利用Kotlin的协同程序吗?
  • 如何在Kotlin中实现这个Java接口?
  • kotlin编译器问题未解决的类
  • 不能执行kotlin协程(没有这样的方法exception
  • Kotlin是否提供额外的安全性?
  • JavaFx / Kotlin中的多线程图像呈现
  • Kotlin language will be the best programming language for Android.