zoukankan      html  css  js  c++  java
  • 欢快的使用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、完整代码点击这里

  • 相关阅读:
    Extjs Window用法详解 2 打印具体应用
    Extjs Window用法详解
    Ext.util.Format.date与Ext.Date.format区别, 转换时间戳
    Ext.util.Format.date 时间格式的设置与转换
    Singleton单例对象的使用
    C# Message类的属性Msg所关联的消息ID
    C#实现语音朗读功能
    iOS:二叉树多级表格的使用,使用三方库TreeTableView-master实现对json解析数据的递归遍历整理成树状结构
    iOS: 删除真机测试的Provisioning Profile后,在Code Singing中出现entitlements.plist文件无效,解决办法如下:
    iOS:Xcode7以上版本安装镜像文件.dmg
  • 原文地址:https://www.cnblogs.com/fengju/p/6174276.html
Copyright © 2011-2022 走看看