欢快的使用Unity JSON吧

时间:2023-03-09 08:35:07
欢快的使用Unity JSON吧

0x01:前言

Unity 5.3加入了UnityUtility类,意味着Unity终于有了自己原生态的JSON库。Unity主要用来游戏开发,JSON做为游戏开发中最受欢迎的配置文件。在官方没有库支持的时候,大家都使用不同的库,我们的项目选择了LitJson,是否选用官方的JSON,只有对比之后才能知道结论。

0x02:如何使用

定义类:

[System.Serializable]
class Buff
{
public int id;
public string description;
public double baseAttack;
public bool canRepeat;
} [System.Serializable]
class PlayerInfo
{
public int id;
public string name;
public List<Buff> buffList;
}

初始化对象:

 PlayerInfo playerInfo = new PlayerInfo
{
id = 1001,
name = "lfwu",
buffList = new List<Buff>
{
new Buff
{
id = 1001001,
description = "this buff can reduce speed",
baseAttack = 20.0,
canRepeat = false
},
new Buff
{
id = 1001002,
description = "this buff can increase physic attack",
baseAttack = 0,
canRepeat = true
}
}
};

Unity3d 调用方式:

序列化:

string jsonStr = JsonUtility.ToJson(playerInfo);

反序列化:

PlayerInfo playerInfo = JsonUtility.FromJson<PlayerInfo>(jsonStr);

LitJson 调用方式:

序列化:

string jsonStr = JsonMapper.ToJson(playerInfo);

反序列化:

PlayerInfo playerInfo = JsonMapper.ToObject<PlayerInfo>(jsonStr);

结论:

1、使用方式没多大区别

2、LitJson提供了更多的接口,支持返回Object 对象,UnityJson 反序列化只支持对象

3、UnityJson类型必须加 [System.Serializable]属性

4、LitJson有源代码

5、UnityJson只支持Object json 字符串

string jsonObjStr = "{\"obj\":{}}"; // 只支持对象json
string jsonArrStr = "[]"; // 不支持

0x03:性能比较

序列化

通过统计解析耗费时间来对比:

sw.Start();
for(var i = 0; i < count; ++i)
{
litJsonStr = JsonMapper.ToJson(playerInfo);
}
Debug.Log("LitJson Serialize use time:" + sw.ElapsedMilliseconds); sw.Reset();
sw.Start();
for(var i = 0; i < count; ++i)
{
unityJsonStr = JsonUtility.ToJson(playerInfo);
}
Debug.Log("UnityJson Serialize use time:" + sw.ElapsedMilliseconds);

反序列化

sw.Reset();
sw.Start();
for(var i = 0; i < count; ++i)
{
PlayerInfo litPlayerInfo = JsonMapper.ToObject<PlayerInfo>(litJsonStr);
}
Debug.Log("LitJson Deserialzie use time:" + sw.ElapsedMilliseconds); sw.Reset();
sw.Start(); for(var i = 0; i < count; ++i)
{
PlayerInfo unityJsonInfo = JsonUtility.FromJson<PlayerInfo>(litJsonStr);
}
Debug.Log("UnityJson Deserialize use time:" + sw.ElapsedMilliseconds);

序列化和反序列化结果:

欢快的使用Unity JSON吧

序列化字符串长度

欢快的使用Unity JSON吧

结论:

1、Unity3d在序列化和反序列化效率完胜LitJson

2、序列化后的字符串内容和长度一致

0x04:总结

在选择使用库的时候,我们通常要考虑一下问题:

1、易用性

2、效率性能

3、可维护性

4、稳定性

通过对比测试,欢快的使用UnityJson吧。

0x05:说明

1、Unity版本5.4, LitJson 0.9

2、画图使用Excel

3、参考Unity官方,LitJson GitHub

4、完整代码点击这里