You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

升级targetSdk至31后,Android12设备Gson序列化List<File>返回空对象

问题分析

targetSdk升级到31后,Android 12对反射访问非SDK接口做了更严格的限制。Gson默认依赖反射序列化File对象,但此时无法访问File内部的私有字段(比如path),导致序列化出空的{},最终得到[{}]的结果。低版本系统或targetSdk30环境下,反射限制较宽松,因此能正常工作。

解决方案

自定义TypeAdapter手动控制File的序列化逻辑,绕开反射访问受限字段:

public class FileTypeAdapter extends TypeAdapter<File> {
    @Override
    public void write(JsonWriter out, File value) throws IOException {
        if (value == null) {
            out.nullValue();
            return;
        }
        // 序列化File的绝对路径,可根据业务需求替换为文件名、父路径等字段
        out.value(value.getAbsolutePath());
    }

    @Override
    public File read(JsonReader in) throws IOException {
        // 若无需反序列化,可抛出UnsupportedOperationException简化实现
        String path = in.nextString();
        return new File(path);
    }
}

创建Gson实例时注册该适配器:

public void save(Context context, List<File> files) {
    Gson gson = new GsonBuilder()
            .registerTypeAdapter(File.class, new FileTypeAdapter())
            .create();
    String json = gson.toJson(files);
    // 此时json会输出类似["/storage/emulated/0/test.txt", "/storage/emulated/0/docs"]的路径数组
}

内容的提问来源于stack exchange,提问作者prem

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 07:05:52