[项目组] 配置表解析升级指南

[项目组] 配置表解析升级指南_第1张图片
ORM.png

目的与好处

  • 不依赖于具体存储格式, 统筹表格格式差异(xml和csv)
  • 有报错机制: 能够清楚指出 某表.某行.某列 数据有误, 或格式有误, 能统一弹出提示窗口, 让策划自己玩耍.
  • 简化代码, 逐步统一所有配置表处理代码与风格.
  • 类型自动转换, 支持[所有基本数据类型], 以及枚举, Vector2, Vector3, 数组(可自定义分隔符, 默认'|', 可配置)

迁移代价

  • 需要使用上进行适应, 习惯新的方式, 对无法满足的需求进行指出.
  • 特殊类型转换代码依然需要自行从原代码中copy出来, 只是换了另一种方式.
  • 改动还是有工作量在, 而且需要细心迁移, 注意检测结果.

操作细则:

DriverLicenseVo, SeasonRankInfo为例: DriverLicenseConfig.xml, rank_match.xml

1.配置类继承 DBaseInfoDUniqueInfo, 使用特性[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;
    
    title大小写完全一致最省事, 什么都不用配置
  • 2.如果属性名字与xml中的不对应
    使用特性[TableColumn(Name = "数据列名称")]来指定.
# SeasonRankInfo.cs
    // 段位描述
    [TableColumn(Name = "Describe")]
    public string des = string.Empty;
    
    特别注意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(...);
LoadConfig(...);
  • 2.多表合一需要多传一个参数
LoadConfig(ConfigPath.PVE_CONFIG, "SectionName", LoadMode.NetFirst);

SectionName 就是多表中的子节点名, 一张表有多少个子表, 就要写几行, 只是类名不同, 子表名称不同

4.XmlOperation中xml转vo的代码, 修改为
参考 XmlOperation.LoadXMLDriveringLicenseCofing:
// 获取整个表格List
List vos = TableReader.GetInfos();
参考 XmlOperation.LoadXMlMatchRankInfo:
// 根据id获取单条记录 [继承DUniqueInfo才能使用此API]
DriverLicenseVo vo = TableReader.GetInfo(id);

整理过程如遇到困难, 需要扩展功能, 欢迎提出需求。

你可能感兴趣的:([项目组] 配置表解析升级指南)