在安卓开发中,存储对象(如自定义类实例)到本地需要先将对象序列化,再通过文件、数据库或其他存储机制保存,以下是常见的实现方式:
原理:将对象通过 Serializable
或 Parcelable
接口序列化为字节流,存入文件。
适用场景:简单对象存储,无需频繁读写。
步骤:
Serializable
接口。ObjectOutputStream
写入文件。ObjectInputStream
反序列化。示例代码:
// 写入对象 ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("data.ser")); oos.writeObject(myObject); oos.close(); // 读取对象 ObjectInputStream ois = new ObjectInputStream(new FileInputStream("data.ser")); MyObject obj = (MyObject) ois.readObject();
原理:将对象映射为数据库表,通过ORM(如Room)简化操作。
适用场景:结构化数据、复杂查询、多对象关联。
步骤:
@Entity
注解的实体类。@Dao
定义增删改查方法。RoomDatabase
构建数据库。示例代码:
@Entity public class User { @PrimaryKey public int id; public String name; } @Dao public interface UserDao { @Insert void insert(User user); @Query("SELECT FROM User") List<User> getAll(); } // 使用Room.databaseBuilder初始化数据库
限制:仅支持基本数据类型(如 int
、String
),需手动序列化对象。
适用场景:轻量级配置或简单数据缓存。
实现方式:将对象转为JSON字符串后存储。
// 写入 SharedPreferences prefs = context.getSharedPreferences("prefs", MODE_PRIVATE); prefs.edit().putString("user", new Gson().toJson(user)).apply(); // 读取 User user = new Gson().fromJson(prefs.getString("user", ""), User.class);
场景 | 推荐方案 | 理由 |
---|---|---|
临时缓存少量简单数据 | SharedPreferences | 快速读写,无需复杂操作 |
结构化数据与复杂查询 | SQLite + Room/GreenDao | 支持索引、事务,适合高频操作 |
高性能实时数据同步 | Realm | 内存级性能,支持数据变更监听 |
持久化对象(如配置) | 文件存储(序列化) | 简单直接,无需依赖数据库 |
@ForeignKey
)。@Entity(primaryKeys = {"id1", "id2"})
)。解答:
@Relation
(Room)或创建关联表。 @Entity public class Group { @PrimaryKey public int id; @Ignore public List<User> users; // 忽略字段,需手动处理关联 }
解答:
serialVersionUID
确保兼容性。 @Migration
(Room)或版本号管理数据库升级,处理字段增减或类型