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

欢快的使用Unity JSON吧的更多相关文章

  1. Unity Json解析IPA

    今天看到一个unity 自带的解析json的IPA,感觉比litjson好用很多,废话不多,上代码 using System.Collections; using System.Collections ...

  2. Unity Json 之三

    今天在网上看到一个simplejson,直接调用这两个API就可以了,简单易用 string jsonstr = SimpleJson.SimpleJson.SerializeObject(json) ...

  3. Unity json

    MiniJSON.cs using UnityEngine; using System; using System.Collections; using System.Collections.Gene ...

  4. unity json解析IPA后续

    以前说到的,有很大的限制,只能解析简单的类,如果复杂的就会有问题,从老外哪里看到一片博客,是将类中的list   等复杂对象序列化, using UnityEngine; using System.C ...

  5. Unity的Json解析&lt;二&gt;–写Json文件

    本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接:http://blog.csdn.net/cartzhang/article/details/50378805 作者:car ...

  6. C#开源

    商业协作和项目管理平台-TeamLab 网络视频会议软件-VMukti 驰骋工作流程引擎-ccflow [免费]正则表达式测试工具-Regex-Tester Windows-Phone-7-SDK E ...

  7. C# 开源项目一

    商业协作和项目管理平台-TeamLab 网络视频会议软件-VMukti 驰骋工作流程引擎-ccflow [免费]正则表达式测试工具-Regex-Tester Windows-Phone-7-SDK E ...

  8. C#开源大全--汇总(转)

    商业协作和项目管理平台-TeamLab 网络视频会议软件-VMukti 驰骋工作流程引擎-ccflow [免费]正则表达式测试工具-Regex-Tester Windows-Phone-7-SDK E ...

  9. C#开源大全--汇总

    商业协作和项目管理平台-TeamLab 网络视频会议软件-VMukti 驰骋工作流程引擎-ccflow [免费]正则表达式测试工具-Regex-Tester Windows-Phone-7-SDK E ...

随机推荐

  1. wmware 怎么 跟主机相互通信

    VMnet1和VMware8其实就是软件模拟出来的两块网卡提供DHCP服务,两块网卡对应VMware的两种不同的模式VMWare提供了三种工作模式,它们是bridged(桥接模式).NAT(网络地址转 ...

  2. mysql bin-log和innodb_log的关系

    首先,二进制日志会记录所有与MySQL数据库有关的日志记录,包括InnoDB.MyISAM.Heap(memory除外)等其他存储引擎的日志.而InnoDB存储引擎的重做日志记录有关该引擎本身的事务日 ...

  3. WeakHashMap和HashMap的区别

    看Java源码的时候,看到了 WeakHashMap ,我一直以来使用的 都是 HashMap,于是查了一下两者的区别 (一) 查看API文档,WeakHashmap要点如下: 1. 以弱键 实现的基 ...

  4. iOS - Swift NSTimeZone 时区

    前言 public class NSTimeZone : NSObject, NSCopying, NSSecureCoding NSTimeZone 表示时区信息. 1.NSTimeZone 时区的 ...

  5. [itint5]支持删除的后继查询

    http://www.itint5.com/oj/#49 这一题一开始想到是用HashSet+链表来做,链表记录prev和next.这样也可以,后来看到都是连续的整数,而且交流了一下觉得可以用类似并查 ...

  6. javaScript-什么是变量?

    什么是变量? 从字面上看,变量是可变的量:从编程角度讲,变量是用于存储某种/某些数值的存储器.我们可以把变量看做一个盒子,为了区分盒子,可以用BOX1,BOX2等名称代表不同盒子,BOX1就是盒子的名 ...

  7. Docker集群编排工具之Kubernetes(K8s)介绍、安装及使用

    K8s基础原理 k8s中文社区:https://www.kubernetes.org.cn/ 简介 Kubernetes与较早的集群管理系统Mesos和YARN相比,对容器尤其是 Docker的支持更 ...

  8. ECMA Script 6_symbol(symbol.iterator) 新接口_iterator接口

    iterator 接口 只要部署了 iterator 接口 symbol(symbol.iterator), 则可以进行 for...of  遍历

  9. python---基础知识回顾(二)(闭包函数和装饰器)

    一.闭包函数: 闭包函数: 1.在一个外函数中定义了一个内函数 2.内函数里运用了外函数的临时变量,而不是全局变量 3.并且外函数的返回值是内函数的引用.(函数名,内存块地址,函数名指针..) 正确形 ...

  10. 1035 Password (20 分)

    1035 Password (20 分) To prepare for PAT, the judge sometimes has to generate random passwords for th ...