Я пытаюсь создать класс, который сохраняет любой объект в файл, и я не могу понять, что я делаю неправильно.
По сути, у меня есть 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
, где содержимое преобразуется в требуемый тип.
Я просмотрел все подобные проблемы в стеке, но, похоже, ничего не решило мою проблему.