文本存储+类配置(C#)
配置文件格式如下图
第一行是列类型说明,第二行是描述,第三行是对应属性名称,用于反射,之后行是实际数据
\r\n换行,\t分列,单元格内依次由+、|分割
long | string | string[] | string | string | int |
sid | 活动标题 | 活动图片 | 活动名字 | 活动描述 | 是否可见 |
id | tittle | icon | name | desc | visible |
1 | 每日签到领取大礼 | 签到 | 2 | ||
8 | 加官进禄 | jiaguanjinjue_close+jiaguanjinjue_open+huodong_bg | 加官进禄 | 1 |
类结构样式
public class ActivityConfig : Config
{
public readonly long id;
public readonly string tittle;
public readonly string[] icon;
public readonly string name;
/// <summary>
/// 描述;
/// </summary>
public readonly string desc;
/// <summary>
/// 是否可见 (0 不可见,1 可见 由活动界面打开,2 可见 独立界面)
/// </summary>
public readonly int visible;
}
核心逻辑:将文本文件split后每行是一个lineData,以id进行索引;需要读取对应行数据时,反射创建对应类,反射赋值后返回
可选优化:获取数据时可以指定列,不用一次全部反射;当属性被赋值后,删除lineData中对应的原始键值对
...
Dictionary<string, object> lineData;
...
Config instance = Assembly.CreateInstance(configType.FullName) as Config;
FieldInfo[] fields = instance.GetType().GetFields();
FieldInfo field;
for (int m = 0; m < fields.Length; m++)
{
field = fields[m];
field.SetValue(instance, lineData[field.Name]);
}
...
return instance
二进制存储+类配置(C#)
与上诉方案基本相同,除了使用二进制替换文本,故读取原始数据的方法略有不同
ScriptableObject(Unity)
这是Unity中最快最省GC的方案(怀疑Unity直接使用memcpy之类手段在内存中从二进制还原成class),但是对热更新支持并不好,可以用于存储结构不会变化的配置
PBC(lua)
项目使用lua开发,故尝试了云风的pbc,使用与protobuffer区别不大
在解析时,pbc做了一些优化,如果是内嵌的结构,不会直接解出来
下方代码中,解析Person时name、id、email会直接解析,phone却不会解析,仍然是原始数据,直到真正用到才会解析
package tutorial;
message Person {
required string name = 1;
required int32 id = 2; // Unique ID number for this person.
optional string email = 3;
message PhoneNumber {
required string number = 1;
optional int32 type = 2;
}
repeated PhoneNumber phone = 4;
}
pbc对多维数组支持不好,二维数组只能使用如下样式实现
message arrInt {
repeated int32 arr = 2;
}
repeated arrInt arrArrInt= 4;
解析后变成如下结构
arrArrInt = {
{arr = {}},
{arr = {}},
...
}
需要额外操作才能转化为二维数组
lua文件
最终采用的方案,见这篇笔记