
本文介绍一种简洁、可靠的方式,使用 gson 将自定义数据类(如每轮四队得分)序列化为 json,并保存至 android 应用私有内部存储,无需权限,自动隔离,适合小型结构化数据持久化。
本文介绍一种简洁、可靠的方式,使用 gson 将自定义数据类(如每轮四队得分)序列化为 json,并保存至 android 应用私有内部存储,无需权限,自动隔离,适合小型结构化数据持久化。
在开发记分类应用(如四队轮流竞技的计分器)时,需将每轮(Round)的完整得分状态独立保存,并支持后续读取与回放。Android 提供多种本地存储方案,而内部私有文件存储(Internal Storage) 是最轻量、安全且无需声明权限的选择——所有生成的文件仅对本应用可见,系统会随应用卸载自动清理。
✅ 推荐方案:JSON + Serializable + Gson(轻量可靠)
首先,定义清晰的数据模型。由于每轮包含四个整型得分,推荐使用 Kotlin data class 并实现 Serializable(便于 Gson 反序列化兼容性):
import java.io.Serializable
data class Round(
val team1Score: Int = 0,
val team2Score: Int = 0,
val team3Score: Int = 0,
val team4Score: Int = 0
) : Serializable? 提示:为字段添加默认值(如 = 0)可提升反序列化鲁棒性,避免空值异常。
接着,创建通用工具类 FileHelper,封装 JSON 写入与读取逻辑(依赖 Gson 库,请在 app/build.gradle 中添加):
implementation 'com.google.code.gson:gson:2.10.1'
import android.app.Application
import android.content.Context
import com.google.gson.Gson
import java.io.File
object FileHelper {
// ✅ 写入:将任意对象序列化为 JSON 并保存到 /data/data/<package>/files/
fun writeToJsonFile(context: Context, data: Any, fileName: String) {
val json = Gson().toJson(data)
File(context.filesDir, "$fileName.json").writeText(json)
}
// ✅ 读取:从 JSON 文件反序列化为指定类型对象(支持泛型)
inline fun <reified T : Any> getFromJsonFile(
context: Context,
fileName: String
): T? {
return try {
val file = File(context.filesDir, "$fileName.json")
if (!file.exists()) return null
val json = file.readText()
Gson().fromJson(json, T::class.java)
} catch (e: Exception) {
e.printStackTrace()
null
}
}
}? 关键说明:
- 使用 context.filesDir 访问应用私有目录,路径如 /data/data/com.yourpackage/files/;
- 文件名建议统一后缀(如 .json),便于识别与管理;
- inline + reified 泛型使调用更简洁(无需传 Class
参数)。
? 实际使用示例
假设当前进行到第 3 轮,用户点击“保存本轮”:
// 构建本轮数据
val currentRound = Round(
team1Score = binding.scoreTeam1.text.toString().toIntOrNull() ?: 0,
team2Score = binding.scoreTeam2.text.toString().toIntOrNull() ?: 0,
team3Score = binding.scoreTeam3.text.toString().toIntOrNull() ?: 0,
team4Score = binding.scoreTeam4.text.toString().toIntOrNull() ?: 0
)
// 保存为 "round3.json"
FileHelper.writeToJsonFile(this, currentRound, "round3")
// 读取时(例如加载历史记录列表)
val round1: Round? = FileHelper.getFromJsonFile(this, "round1")
val round2: Round? = FileHelper.getFromJsonFile(this, "round2")⚠️ 注意事项与最佳实践
- 不要滥用 Serializable 做网络或跨进程传输:此处仅用于 Gson 序列化,无性能瓶颈;
- 文件名需唯一且可控:建议用递增数字("round$roundNumber")或时间戳("round_${System.currentTimeMillis()}"),避免覆盖;
- 异常处理不可省略:JSON 解析失败、文件不存在、磁盘满等均应捕获并降级处理(如返回默认值);
- 大数据量?考虑 Room:若轮次达数百轮或需模糊查询、排序、条件筛选,应迁移到 SQLite + Room;
- 敏感数据勿明文存 JSON:本例为公开得分,若含用户身份等信息,请启用加密(如 Android Keystore + AES)。
通过以上方式,你即可在几分钟内实现稳定、可维护、符合 Android 最佳实践的本地数据持久化,专注业务逻辑,而非存储细节。


















