跳到主要内容

Saver

重要 注意 提醒

Coding Style wiki


SaverSaverSystem抽象存储器基类 (实现 ISaverIDisposable),定义字符串/整数/浮点数的基本键值存取抽象方法 (由子类决定存储后端),并提供以文本形式存储的 Data Map 功能 (多条 key value 数据打包于单一字符串键中,具解析缓存);内置实现有 PlayerPrefsSaverEditorPrefsSaver,也可继承自行扩展

命名空间OxGKit.SaverSystem
类型public abstract class Saver : ISaver, IDisposable
源码Saver.csISaver.cs
using OxGKit.SaverSystem;

快速上手

using OxGKit.SaverSystem;

// 创建存储器 (以内置 PlayerPrefsSaver 为例)
Saver saver = new PlayerPrefsSaver();

// 基本存取
saver.SaveInt("language", 2);
int language = saver.GetInt("language", 0);

// 文本形式存储 (单一 contentKey 中存储多条 key value 数据)
saver.SaveData("appPrefs", "lastLogin", "2026-07-29");
string lastLogin = saver.GetData("appPrefs", "lastLogin", null);

通用规则

ISaver 接口

public interface ISaver
{
void SaveString(string key, string value);

string GetString(string key, string defaultValue = "");

void SaveInt(string key, int value);

int GetInt(string key, int defaultValue = 0);

void SaveFloat(string key, float value);

float GetFloat(string key, float defaultValue = 0f);

bool HasKey(string key);

void DeleteKey(string key);

void DeleteAll();
}

Saver 的基本存取方法皆为 abstract (对应 ISaver 接口),由子类重写决定存储后端;文本数据功能 (SaveData / GetData / DeleteData / DeleteContext) 则由基类实现,任何子类皆可直接使用

文本数据格式

SaveData 会将多条数据以每行一条 key value 的格式,存储于单一字符串键 (contentKey) 的文本内容中:

# 以 '#' 开头的行视为注释
lastLogin 2026-07-29
resolution 1920x1080

重要 每行以第一个空格分隔 key 与 value:key 不可包含空格;value 可包含空格,但不可包含换行 (逐行解析)。

提醒 建议重复使用同一个 Saver 实例GetData 的解析缓存以实例为单位,每次重新创建实例会失去缓存效果。

存储定位

注意 本系统定位为设置值与小型数据的键值存储 (模块概览详见模块介绍);无 bool 与对象 API,bool 可以 int (0/1) 存储,对象可自行序列化为 JSON 字符串后通过 SaveString 存储。


基本存取

方法总览

方法说明
SaveString存储字符串。
GetString获取字符串。
SaveInt存储整数。
GetInt获取整数。
SaveFloat存储浮点数。
GetFloat获取浮点数。
HasKey检查指定键是否存在。
DeleteKey删除指定键。
DeleteAll删除所有键。

SaveString

public abstract void SaveString(string key, string value)

存储字符串 (由子类实现存储后端)。

saver.SaveString("name", "michael");

GetString

public abstract string GetString(string key, string defaultValue = "")

获取字符串,键不存在时返回 defaultValue

SaveInt

public abstract void SaveInt(string key, int value)

存储整数。

saver.SaveInt("language", 2);

GetInt

public abstract int GetInt(string key, int defaultValue = 0)

获取整数,键不存在时返回 defaultValue

SaveFloat

public abstract void SaveFloat(string key, float value)

存储浮点数。

saver.SaveFloat("bgmVolume", 0.8f);

GetFloat

public abstract float GetFloat(string key, float defaultValue = 0)

获取浮点数,键不存在时返回 defaultValue

HasKey

public abstract bool HasKey(string key)

检查指定键是否存在。

DeleteKey

public abstract void DeleteKey(string key)

删除指定键。

DeleteAll

public abstract void DeleteAll()

删除所有键 (影响范围依存储后端而定,详见各实现页面)。


文本数据 (Data Map)

方法总览

方法说明
SaveData通过文本形式存储数据 (新增或更新单条 key value)。
GetData获取文本中的特定数据 (具解析缓存)。
DeleteData删除文本中的特定数据。
DeleteContext删除全文本数据 (含解析缓存)。
ParsingDataMap(静态) 解析文本数据为字典。
Dispose释放解析缓存。

SaveData

public void SaveData(string contentKey, string key, string value)

contentKey 的文本内容中新增或更新一条 key value 数据 (内部通过 GetString / SaveString 读写整份文本),并标记 Dirty 供 GetData 重新解析。

saver.SaveData("appPrefs", "lastLogin", "2026-07-29");
saver.SaveData("appPrefs", "resolution", "1920x1080");

GetData

public string GetData(string contentKey, string key, string defaultValue = null)

获取 contentKey 文本中指定 key 的数据;文本不存在或该条数据为空时返回 defaultValue。解析结果会以 contentKey 为单位缓存 (Dirty Flag 机制),仅在 SaveData / DeleteData 之后才会重新解析文本。

string lastLogin = saver.GetData("appPrefs", "lastLogin", null);

DeleteData

public void DeleteData(string contentKey, string key)

删除 contentKey 文本中指定 key 的数据行,并标记 Dirty。

saver.DeleteData("appPrefs", "lastLogin");

DeleteContext

public void DeleteContext(string contextKey)

删除整份文本数据 (内部调用 DeleteKey 删除存储键),并一并清除对应的解析缓存与 Dirty 标记。

saver.DeleteContext("appPrefs");

ParsingDataMap

public static Dictionary<string, string> ParsingDataMap(string content)

(静态方法) 将文本内容解析为 Dictionary<string, string>:依换行逐行分割,跳过 # 开头的注释行,每行以第一个空格分隔 key 与 value;重复的 key 只取第一条

// 也可单独作为 "key value" 行格式的配置文件解析器
string content = saver.GetString("appPrefs");
Dictionary<string, string> dataMap = Saver.ParsingDataMap(content);

提醒 由于支持 # 注释行,该格式也适合作为可手动编辑的配置文件格式 (例如 OxGFrame 的媒体 URL 配置文件即使用 Saver.ParsingDataMap 解析)。

Dispose

public virtual void Dispose()

释放解析缓存 (Data Map 缓存与 Dirty 标记)。

注意 Dispose 后缓存字典会被置空,不可再使用该实例的文本数据功能,需重新创建 Saver 实例。


自定义 Saver

继承 Saver 并重写抽象方法,即可将数据存储至任意后端 (文件、加密存储、云端等);文本数据功能 (Data Map) 由基类提供,无需另行实现

using OxGKit.SaverSystem;

public class FileSaver : Saver
{
public override void SaveString(string key, string value) { /* 写入文件 */ }

public override string GetString(string key, string defaultValue = "") { /* 读取文件 */ return defaultValue; }

public override void SaveInt(string key, int value) => this.SaveString(key, value.ToString());

public override int GetInt(string key, int defaultValue = 0) => int.TryParse(this.GetString(key), out var value) ? value : defaultValue;

public override void SaveFloat(string key, float value) => this.SaveString(key, value.ToString());

public override float GetFloat(string key, float defaultValue = 0f) => float.TryParse(this.GetString(key), out var value) ? value : defaultValue;

public override bool HasKey(string key) { /* ... */ return false; }

public override void DeleteKey(string key) { /* ... */ }

public override void DeleteAll() { /* ... */ }
}