欢快的使用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、完整代码点击这里

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值