欢快的使用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、完整代码点击这里
欢快的使用Unity JSON吧的更多相关文章
- Unity Json解析IPA
今天看到一个unity 自带的解析json的IPA,感觉比litjson好用很多,废话不多,上代码 using System.Collections; using System.Collections ...
- Unity Json 之三
今天在网上看到一个simplejson,直接调用这两个API就可以了,简单易用 string jsonstr = SimpleJson.SimpleJson.SerializeObject(json) ...
- Unity json
MiniJSON.cs using UnityEngine; using System; using System.Collections; using System.Collections.Gene ...
- unity json解析IPA后续
以前说到的,有很大的限制,只能解析简单的类,如果复杂的就会有问题,从老外哪里看到一片博客,是将类中的list 等复杂对象序列化, using UnityEngine; using System.C ...
- Unity的Json解析<二>–写Json文件
本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接:http://blog.csdn.net/cartzhang/article/details/50378805 作者:car ...
- C#开源
商业协作和项目管理平台-TeamLab 网络视频会议软件-VMukti 驰骋工作流程引擎-ccflow [免费]正则表达式测试工具-Regex-Tester Windows-Phone-7-SDK E ...
- C# 开源项目一
商业协作和项目管理平台-TeamLab 网络视频会议软件-VMukti 驰骋工作流程引擎-ccflow [免费]正则表达式测试工具-Regex-Tester Windows-Phone-7-SDK E ...
- C#开源大全--汇总(转)
商业协作和项目管理平台-TeamLab 网络视频会议软件-VMukti 驰骋工作流程引擎-ccflow [免费]正则表达式测试工具-Regex-Tester Windows-Phone-7-SDK E ...
- C#开源大全--汇总
商业协作和项目管理平台-TeamLab 网络视频会议软件-VMukti 驰骋工作流程引擎-ccflow [免费]正则表达式测试工具-Regex-Tester Windows-Phone-7-SDK E ...
随机推荐
- js公有、私有、静态属性和方法的区别
现下,javascript大行其道,对于网站开发人员来说,javascript是必需掌据的一门语言,但随着jquery等框架的流行和使用,许多人对于原生javascript缺乏深入的理解, ...
- Codeforces 682C Alyona and the Tree(树形DP)
题目大概说给一棵点有权.边也有权的树.一个结点v不高兴当且仅当存在一个其子树上的结点u,使得v到u路径上的边权和大于u的权值.现在要不断地删除叶子结点使得所有结点都高兴,问最少删几个叶子结点. 一开始 ...
- HDU4511 小明系列故事——女友的考验(AC自动机 + DP)
题目大概说有平面有n个点,从1点出发走到n点,每一步只能走到序号比当前更大的点且走的序列不能包含给定的m个序列中的任何一个,问1走到n的最短路. 用m个序列建个AC自动机,后缀包含整个序列的结点标记一 ...
- Eclipse: Resource is out of sync with the file system when publishing to tomcat server on Eclipse
Link: http://stackoverflow.com/questions/4343735/avoiding-resource-is-out-of-sync-with-the-filesyste ...
- 假装有题目 & Trie+贪心
题意: 从N个数中选出两个使其异或值最大. SOL: 建立一个01字典树,然后对每一个数在树上贪心即可...Trie一个挺好的运用,复杂度O(n*n的位数) CODE: #include <cs ...
- HDU 1754区间最值 & SPLAY
真是亲切的1754啊..第一道傻逼版的线段树做的是这个,后来学了zkw做的是这个,在后来决定打lrj线段树又打了一遍,如今再用splay和老朋友见面 从上到下依次为:加了读入优化的splay,sp ...
- CUDA程序设计(三)
算法设计:基数排序 CUDA程序里应当尽量避免递归,因而在迭代排序算法里,基数排序通常作为首选. 1.1 串行算法实现 十进制位的基数排序需要考虑数位对齐问题,比较麻烦.通常实现的是二进制位的基数排序 ...
- JS中关于比较运算符的问题(a===b)
之前也会碰到a===b和a==b的表达式,但都没有仔细的看资料,今天看canvas有关的书中提到了,就mark一下: a == b 说明:a与b相等: a ===b 说明:a与b相同,并且类型 ...
- IOS 蓝牙相关-app作为外设被连接的实现(3)
再上一节说了app作为central连接peripheral的情况,这一节介绍如何使用app发布一个peripheral,给其他的central连接 还是这张图,central模式用的都是左边的类,而 ...
- U-Boot命令大全(功能参数及用法)
U-Boot上电启动后,按任意键可以退出自动启动状态,进入命令行. U-Boot 2010.03 (Sep 25 2011 - 16:18:50) DRAM: 64 MB Flash: ...