小说网 找小说 无限小说 烟雨红尘 幻想小说 酷文学 深夜书屋

欢快的使用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);

序列化和反序列化结果:

序列化

序列化字符串长度

字符串长度

结论:

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、完整代码点击这里

posted on 2016-10-19 16:43  王峰炬  阅读(180)  评论(1编辑  收藏  举报

导航