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

安卓开发中如何在SharedPreferences中存储自定义Model类对象

基于原生SharedPreferences的对象存取方案

核心思路是将Java对象序列化为JSON字符串后存入,读取时再将JSON反序列化为对应对象,不需要改动原有存储逻辑,成本最低,推荐用Gson完成序列化工作:

  1. 先引入Gson依赖(在模块级build.gradle的dependencies块中添加)
dependencies {
    implementation 'com.google.code.gson:gson:2.10.1'
}
  1. 封装通用存取方法
// 存储任意对象到SharedPreferences
public void save(String key, Object object) {
    SharedPreferences.Editor editor = context.getSharedPreferences("data", Context.MODE_PRIVATE).edit();
    String jsonStr = new Gson().toJson(object);
    editor.putString(key, jsonStr);
    editor.apply();
}

// 从SharedPreferences读取指定类型的对象
public <T> T get(String key, Class<T> clazz) {
    SharedPreferences sp = context.getSharedPreferences("data", Context.MODE_PRIVATE);
    String jsonStr = sp.getString(key, "");
    if (jsonStr.isEmpty()) {
        return null;
    }
    return new Gson().fromJson(jsonStr, clazz);
}
  1. 使用示例
// 存储用户对象
MyModel user = new MyModel("李四", "lisi@test.com");
save("user_profile", user);

// 读取用户对象
MyModel savedUser = get("user_profile", MyModel.class);

注意事项

  • 实体类不能包含不可序列化的成员(比如Context、View这类和Android组件绑定的对象),否则会序列化失败
  • 推荐用apply()替代commit()写入:apply()是异步写入磁盘,不会阻塞主线程,避免出现ANR问题
  • 不要存储过大的对象:SharedPreferences本身定位是轻量配置存储,单条数据超过100k建议换其他存储方案
  • 实体类字段变更时要做好兼容,可以配置Gson忽略未知字段避免反序列化失败:
Gson gson = new GsonBuilder().ignoreUnknownFields().create();

轻量替代方案(无需SQLite)

如果不想自己封装序列化逻辑,也可以用更成熟的轻量KV存储组件替代原生SharedPreferences:

  • Jetpack DataStore:谷歌官方推出的SharedPreferences替代方案,支持用Protocol Buffers存储结构化对象,基于协程实现异步读写,不会有ANR风险,兼容性和稳定性更好
  • MMKV:腾讯开源的高性能KV存储组件,原生支持序列化对象存取,读写速度远高于SharedPreferences,支持多进程场景,适合对性能要求较高的项目

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 14:54:00