升级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
相关产品推荐
相关产品推荐

