Gson反序列化ResolveInfo列表报无法创建CharSequence实例异常
异常根本原因
抛出这个错误的核心逻辑非常明确:
- Gson默认的反序列化机制只支持对有公开无参构造的普通类做自动实例化,遇到接口、抽象类类型时,因为无法确定要实例化的具体实现类,就会抛出你看到的异常。
- 你要反序列化的
ResolveInfo是Android系统框架类,其内部存在声明类型为CharSequence的字段——CharSequence本身就是一个接口,常见实现包括String、SpannableString等,Gson碰到这个字段类型时不知道该创建哪个类的实例,直接触发报错。 - 额外提醒:直接用Gson序列化/反序列化系统框架类本身就存在兼容性风险:不同Android版本下
ResolveInfo的字段结构、字段类型可能存在差异,且类内部存在大量不支持序列化的跨进程对象引用,哪怕解决了当前CharSequence的实例化问题,后续也很容易出现字段值丢失、类型不匹配、其他接口实例化失败的问题。
修复方案
- 推荐方案:不要直接序列化/反序列化系统框架类
ResolveInfo。自定义一个普通的数据类,只提取你业务实际需要的字段(比如包名、启动Activity类名、应用名称、图标资源ID等),序列化、反序列化操作都针对自定义数据类执行,从根源上规避框架类反序列化的所有兼容问题。 - 临时适配方案:如果一定要直接反序列化
ResolveInfo,给Gson注册CharSequence对应的类型适配器,明确指定CharSequence类型按String做序列化和反序列化,代码如下:
Gson gson = new GsonBuilder() .registerTypeAdapter(CharSequence.class, new TypeAdapter<CharSequence>() { @Override public void write(JsonWriter out, CharSequence value) throws IOException { out.value(value == null ? null : value.toString()); } @Override public CharSequence read(JsonReader in) throws IOException { return in.nextString(); } }) .create();
注意:该方案仅能解决当前CharSequence接口的实例化问题,若后续反序列化时碰到ResolveInfo内其他接口/抽象类类型的字段,或是不同系统版本下ResolveInfo结构发生变化,依然会抛出反序列化异常,稳定性较差。
内容的提问来源于stack exchange,提问作者Prasath S
相关产品推荐
相关产品推荐

