目的与好处
- 不依赖于具体存储格式, 统筹表格格式差异(xml和csv)
- 有报错机制: 能够清楚指出 某表.某行.某列 数据有误, 或格式有误, 能统一弹出提示窗口, 让策划自己玩耍.
- 简化代码, 逐步统一所有配置表处理代码与风格.
- 类型自动转换, 支持[所有基本数据类型], 以及枚举, Vector2, Vector3, 数组(可自定义分隔符, 默认'|', 可配置)
迁移代价
- 需要使用上进行适应, 习惯新的方式, 对无法满足的需求进行指出.
- 特殊类型转换代码依然需要自行从原代码中copy出来, 只是换了另一种方式.
- 改动还是有工作量在, 而且需要细心迁移, 注意检测结果.
操作细则:
以DriverLicenseVo, SeasonRankInfo为例: DriverLicenseConfig.xml, rank_match.xml
1.配置类继承 DBaseInfo 或 DUniqueInfo, 使用特性[TableFile]
// 无唯一ID
[TableFile(Name = "DriverLicenseConfig.xml")]
public class DriverLicenseVo : DBaseInfo
// 有唯一ID, 需要填写PK(主键)字段的名词, 对应xml中某唯一列
[TableFile(PK = "Rank", Name = "rank_math.xml")]
public class SeasonRankInfo : DUniqueInfo
#特性说明:
- PK: 主键名
- Name: 配置文件全名
#基类说明:
- DBaseInfo: 无唯一列的数据类继承
- DUniqueInfo: 有唯一列的数据类继承, 需要填写PK列名
2.特殊需求
类型处理不能满足:
#DriverLicenseVo.cs
// 原始数据需要拼接一段字符串, 才进行枚举转换"License"
[TableColumn(Name = "driverLevel")]
private string _driverLevel
{
set { driverLevel = (DriverLevelType)Enum.Parse(typeof(DriverLevelType), "License" + value); }
}
// 驾照等级
public DriverLevelType driverLevel = DriverLevelType.None;
- 说明: 设置了[TableColumn(Name = "driverLevel")] 中的Name优先于字段原名.
所以可以写一个private的setter, 进行类型转换处理
3.配置类修改说明
- 1.属性名称与xml字段同名: xml的AttributeName对应类的FieldName, 会直接进行赋值.
# DriverLicenseVo.cs
// 驾照标题
public string title = null;
<item ... title="新手教程" ...></item>
title大小写完全一致最省事, 什么都不用配置
- 2.如果属性名字与xml中的不对应
使用特性[TableColumn(Name = "数据列名称")]来指定.
# SeasonRankInfo.cs
// 段位描述
[TableColumn(Name = "Describe")]
public string des = string.Empty;
<item ... Describe="青铜" ...></item>
特别注意xml中存在英文单词拼写错误, 导致与类中字段名不一致的情况
- 3.若需要进行"string".Split(',')进行处理的数组类型, 则使用特性[TableColumn(Sp = ",")]来指定.
# DriverLicenseVo.cs
[TableColumn(Sp = ",")]
// 机器人名称
public string[] robotNames = null;
// 上面配置相当于旧代码:
vo.robotNames = table["robotNames"].ToString().Split(',');
4.加载代码添加泛型参数:
- 1.在ConfigLoader.InitLoaderQueue配置加载入口处, 修改代码如下:
LoadConfig<DriverLicenseVo>(...);
LoadConfig<SeasonRankInfo>(...);
- 2.多表合一需要多传一个参数
LoadConfig<SectionIndexTableVo>(ConfigPath.PVE_CONFIG, "SectionName", LoadMode.NetFirst);
SectionName 就是多表中的子节点名, 一张表有多少个子表, 就要写几行, 只是类名不同, 子表名称不同
4.XmlOperation中xml转vo的代码, 修改为
参考 XmlOperation.LoadXMLDriveringLicenseCofing:
// 获取整个表格List
List<DriverLicenseVo> vos = TableReader.GetInfos<DriverLicenseVo>();
参考 XmlOperation.LoadXMlMatchRankInfo:
// 根据id获取单条记录 [继承DUniqueInfo才能使用此API]
DriverLicenseVo vo = TableReader.GetInfo<DriverLicenseVo>(id);
整理过程如遇到困难, 需要扩展功能, 欢迎提出需求。
网友评论