Android SDK33下如何用.getSerializable()反序列化为HashMap<Int,Int>
解决SDK 33下HashMap<Int, Int>的Serializable读取问题
针对SDK 33升级后getSerializable API的变化,以及泛型类字面量无法使用的问题,给你三个可行的解决办法:
方法一:原始类型强转+抑制警告
利用Java泛型擦除的特性,直接传入HashMap::class.java后强转为目标泛型类型,同时添加注解消除IDE警告:
@Suppress("UNCHECKED_CAST") val data = savedInstanceState.getSerializable("answer", HashMap::class.java) as HashMap<Int, Int>
这种方法最简单直接,不需要额外依赖或自定义类,适合简单的泛型集合场景。
方法二:自定义泛型HashMap子类
创建一个指定泛型的HashMap子类,这样就能直接使用类字面量调用新API,完全避免强转:
// 定义自定义子类 class IntIntHashMap : HashMap<Int, Int>() // 存储时存入IntIntHashMap实例 savedInstanceState.putSerializable("answer", IntIntHashMap().apply { put(1, 100) put(2, 200) }) // 读取时直接调用API val data = savedInstanceState.getSerializable("answer", IntIntHashMap::class.java)!!
这种方法类型安全性最高,适合需要频繁使用该泛型HashMap的场景。
方法三:借助Gson序列化/反序列化(依赖Gson库)
如果项目中已经引入Gson,可以通过将Serializable对象转成Json字符串,再解析为目标泛型类型,绕过类字面量的限制:
val serializable = savedInstanceState.getSerializable("answer") val gson = Gson() val data = gson.fromJson(gson.toJson(serializable), object : TypeToken<HashMap<Int, Int>>() {}.type)
这种方法适合复杂泛型结构的场景,但会引入序列化开销,简单场景不推荐。
内容的提问来源于stack exchange,提问作者codegsaini
相关产品推荐
相关产品推荐

