已配置自定义TypeConverter仍出现SerializationException问题求助
问题根因
你的类型转换器内部混用了两套JSON解析库,是触发异常的直接原因:
- 存储数据时(
List<Weather>转字符串存入数据库):你用了Gson的gson.toJson(value)做序列化 - 读取数据时(从数据库取出字符串转回
List<Weather>):你用了Kotlinx序列化的Json.decodeFromString(value)做反序列化
Kotlinx序列化属于编译时解析框架,要求目标类必须标注@Serializable注解生成对应序列化器才能正常工作,你没有给Weather类加该注解,所以抛出了Serializer not found的异常。
修复方案
两种方案二选一即可,推荐选择方案一,修改量最小:
方案一:统一使用Gson做转换(无需修改原有实体类)
直接替换Converters类中的toWeatherList方法,用Gson实现List<Weather>的反序列化即可:
@TypeConverter fun toWeatherList(value: String): List<Weather> = gson.fromJson(value, object : TypeToken<List<Weather>>() {}.type)
方案二:统一使用Kotlinx序列化做转换
需要修改三处代码:
- 给Weather类添加
@Serializable注解 - 把Converters类中所有Gson相关的序列化逻辑全部替换为Kotlinx序列化的对应API
- 确认项目gradle配置中已经正确引入Kotlinx序列化的插件和依赖
疑问解答
- 类型转换器本身是可以支撑该场景的,你已经在ForecastDatabase上正确添加了
@TypeConverters(Converters::class)注解,配置没有问题,问题出在转换器内部的实现逻辑 - 只有当你使用Kotlinx序列化库做解析时才需要给Weather类定义序列化方法,使用Gson的场景下不需要额外添加注解,因为Gson是基于反射实现解析的。
内容的提问来源于stack exchange,提问作者Stelios Papamichail
相关产品推荐
相关产品推荐

