Release模式下Retrofit+Gson出现ClassCastException问题求助
解决方案:Release模式下Gson反序列化List出现ClassCastException
问题原因
Release模式中ProGuard对数据类进行了混淆,导致Gson在处理泛型列表List<CatListItem>时,无法识别列表元素的具体类型,只能将每个元素默认解析为LinkedTreeMap,最终在类型转换时抛出ClassCastException。
解决步骤
1. 修复ProGuard混淆规则
在你的ProGuard配置文件中添加以下规则,确保数据类的完整结构不被混淆:
# 保留你的数据类(替换为实际包路径) -keep class com.yourpackage.CatList { *; } -keep class com.yourpackage.CatListItem { *; } # 如果你的数据类都在同一个包下,可以批量保留 # -keep class com.yourpackage.models.** { *; } # 补充:确保泛型类型信息不被混淆(可选但建议) -keepattributes Signature
解释:
- 原规则仅保留了
SerializedName注解的字段,但类名、泛型参数信息被混淆后,Gson无法通过反射确定列表元素的具体类型,只能 fallback 到LinkedTreeMap。 -keepattributes Signature用于保留泛型签名信息,帮助Gson正确解析泛型类型。
2. 校验接口与数据结构的匹配(可选优化)
你的接口返回的JSON是直接的数组[{"name":"1"},{"name":"2"}],接口定义Call<List<CatListItem>?>是正确的,但在onResponse中你用CatList(response.body())创建对象,而CatList类是包含catList字段的包装类,这与返回数据结构不匹配。如果后端确实返回数组,你可以直接使用response.body()获取List<CatListItem>?,无需用CatList包装;如果后端后续会改为返回包含catList字段的对象,那么需要调整接口定义为Call<CatList>。
验证
修改完ProGuard规则后,重新构建Release版本并测试,确认ClassCastException是否消失。
内容的提问来源于stack exchange,提问作者Julio Leon
相关产品推荐
相关产品推荐

