欢快的使用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 ...
随机推荐
- How to: 使用 数据流 实现生产者-消费者模式
producer把消息发送到消息块,consumer从块读取消息. 安装: Install-Package Microsoft.Tpl.Dataflow using System.Thread ...
- NUC_TeamTEST_C && POJ2299(只有归并)
Ultra-QuickSort Time Limit: 7000MS Memory Limit: 65536K Total Submissions: 42627 Accepted: 15507 ...
- 使用expdp时遇到ORA-39002、ORA-39070错误
使用expdp时,遇到”ORA-39002.ORA-39070......”连续报错. 1. 遇到的问题 expdp yguo/dbimp@botnet schemas=yguo dumpfile= ...
- Codeforces Testing Round #10 A. Forgotten Episode
水题,注意数据范围 #include <iostream> using namespace std; int main(){ long long n,a; cin >> n; ...
- ACM:POJ 2739 Sum of Consecutive Prime Numbers-素数打表-尺取法
POJ 2739 Sum of Consecutive Prime Numbers Time Limit:1000MS Memory Limit:65536KB 64bit IO Fo ...
- SDL 五子棋游戏
http://www.jb51.net/article/79271.htm 1.定义窗口大小,棋盘大小 SDL_GetWindowSize()读取窗口大小, 由于棋盘是15*15格局,上下留白一行,在 ...
- Jquery Ajax方法传值到action
假设cshtml文件中是这样的: <script type="text/javascript"> $(document).ready(function(){ $(&qu ...
- node.js不得不说的12点内容
1.node.js,服务器端的javascript,它允许在后端(脱离浏览器环境)运行javascript代码. 2.事件驱动.异步式I/O的编程模式(单线程)是其核心. 3.node.js的java ...
- 1063. Set Similarity (25)
1063. Set Similarity (25) 时间限制 300 ms 内存限制 32000 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Given ...
- Oracle函数解析
一:大小写控制函数 lower()函数:(此函数将全部的大写字母都可以变为小写字母) upper()函数:(将输入的字符串变为大写字母) initcap()函数:(将每个字符串的首字母大写) 二:字 ...