前言
之前博文介绍过了,一种代码导出的工作方式《如何让你的程序加载Excel配置文件》。但这种方式存在一些弊端,比如如果想在运行时替换数据(Reload),就会比较困难(解释执行语言例外)。但在目前的游戏架构中,不论是客户端还是服务器,都强烈的具有这种需求。
主要思想
此时,我们的思路是,分离类定义和数据本身,类定义必须生成为导出语言的代码,以方便IDE识别。数据导出成自动生成类型可以识别的文件格式。
导出类结构
public class TestAllTypeConfig
{
public uint Id;
public uint Id2;
public string[] StringArray;
public uint[] uintArray;
public int[] intArray;
public bool[] boolArray;
public float[] floatArray;
public double[] doubleArray;
public uint uintType;
public string stringType;
public float floatType;
public double doubleType;
}
把excel文件中的定义头,导出成代码(上面的例子是C#),程序员不需要在手写配表匹配的类定义以及数据加载代码(ReadFile方法)。其中,数据加载的代码是和数据文件格式相关联的,这一部分会再导出数据一节中讲解。
此外,我们还需要生成数据容器和访问函数,提供给程序员访问需要的数据。
private static Dictionary<uint, ItemConfig> config = new Dictionary<uint, ItemConfig>();
public static ItemConfig GetConfig(uint id)
{
ItemConfig data;
if (config.TryGetValue(id, out data))
return data;
throw new NullReferenceException(string.Format("配置表ItemConfig不存在id={0}", id));
}
导出数据
数据文件的核心部分显然就是上面config字典中的数据。这应该不是什么难事,有一万种方法可以把一个对象序列化成一个字节流byte[]。我们可要调用现有的类库(比如json),或者自动化生成代码,把对象转化为流。作为逆流程,我们生成对应的Read方法,负责把数据从流读出,并初始化对象。
此外,我们还需要给这个文件增加一些安全机制,让整个文件的格式更加完整。
|CFGF|----VERSIONCODE----|-------------DATA-------------|CHECKSUM|
|CFGF| 文件头,如果读取错误文件,Read方法可以快速返回错误
|VERSIONCODE| 配置表版本码,如果加载代码和数据版本不同,Read方法同样会返回失败
|DATA| 之前提到的数据部分
|CHECKSUM| 文件内容的MD5校验和,防止文件内容被篡改的情况等