需求
在项目开发中需要把很多编辑配置信息做成配置文件,在运行时加载解析使用,这需要在三个要求之间取得较好平衡: 开发便捷,序列化后文件大小,加载速度。当然还需要扩展数据结构后还能加载老数据才行。
CSV这种逗号制表符作为分隔符的文件非常方便使用外部工具编辑,但是需要编写读取代码(可以在读取时判断是否为旧版本数据,不方便热更新),文件大小和加载速度优良。
xml这种就冗余信息太多文件大小没优势,但方便带一些数据标签,behaviorac的行为树信息就是xml配置的。
将要着重对比的是protobuf和json
protobuf能对数据压缩:int字段的值需要几字节编码就用几字节编码而不会全部用4字节编码。而且也不会像json那样把字段名编码进去。所以在示例中json:25K protobuf:8K
它们都能优雅的兼容老版本数据
接下来比较加载速度:
message GoodsInfo //商品信息
{
optional string GoodsIndex = 1;
optional string GoodsId = 2;
optional string CostDollars = 3;
optional bool OnSale = 4;
optional string ExternJson = 5;
}
message QueryGoodsListRsp
{
repeated GoodsInfo GoodsList = 1;
}
C#中用于json的对等结构
[System.Serializable]
class GoodsInfo
{
[SerializeField] public string GoodsIndex;
[SerializeField] public string GoodsId;
[SerializeField] public string CostDollars;
[SerializeField] public bool OnSale;
[SerializeField] public string ExternJson
}
[System.Serializable]
class QueryGoodsListRsp
{
[SerializeField]
public List<GoodsInfo> GoodsList = new List<GoodsInfo>(256);
}
如下测试加载速度:
var start = DateTime.Now.Ticks;
var var1 = SerializeHelper.Deserialize<CSMessage.QueryGoodsListRsp>(File.ReadAllBytes(Application.dataPath + "/proto.bytes"));
Debug.Log(DateTime.Now.Ticks - start);
start = DateTime.Now.Ticks;
var var2 = JsonUtility.FromJson<QueryGoodsListRsp>(File.ReadAllText(Application.dataPath + "/json.txt"));
Debug.Log(DateTime.Now.Ticks - start);
protobuf: 319454
json: 9939
比较出人意料:json加载比protobug快30倍左右。所以protobuf适用于消息,能把消息编码得很小,解析速度就不如改进过的JSON接口JsonUtility了。