GSON десериализация ClassCastException - PullRequest
0 голосов
/ 19 марта 2019

Я пытаюсь создать класс, который сохраняет любой объект в файл, и я не могу понять, что я делаю неправильно.

По сути, у меня есть 2 функции для сериализации и десериализации контента следующим образом:

inline fun <reified T> writeInCache(content: T, file: File) {
    val stream = ObjectOutputStream(FileOutputStream(file))
    stream.writeObject(Gson().toJson(content, object : TypeToken<T>() {}.type))
    stream.close()
}

inline fun <reified T> readFromCache(file: File): T? {
    val stream = ObjectInputStream(FileInputStream(file))
    val streamObject= stream.readObject() as String
    stream.close()
    return Gson().fromJson(streamObject, object : TypeToken<T>() {}.type) as? T
}

Пока это работает во многих случаях, например, с MyClass или List<MyClass> в качестве содержимого.

Но когда я пытаюсь отправить контент с типом List<List<MyClass>> как следует, происходит нечто очень странное.

val list: List<List<MyClass>> = readFromCache(file) ?: emptyList()

Внутри readFromCache класс универсального объекта корректно читается (java.util.List<? extends java.util.List<? extends com.project.entity.MyClass>>), и функция возвращает значение, но когда я пытаюсь получить к нему доступ (list.first().first(), который должен иметь тип MyClass), я получаю исключение classCastException :

ava.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap нельзя привести к com.project.entity.MyClass

Я не понимаю, почему не удается десериализовать правильно, так как тип, кажется, известен, и я особенно не понимаю, почему исключение происходит в этой точке, а не в функции readFromCache, где содержимое преобразуется в требуемый тип.

Я просмотрел все подобные проблемы в стеке, но, похоже, ничего не решило мою проблему.

...