Unity常见的解析数据方式XML,JSON,ProtocolBuf篇(一)Protobuf
概述:
在项目中经常能够使用到的集中数据解析方式,就是XML,JSON,ProtocolBuf了,今天我们来一起学习下,首先按照常用性,先说说ProtocolBuf。一般作为手游项目来说,如果用在客户端和服务器端之间数据交互上面,使用Protobuf无疑是明智的选择,因为Protobuf解析数据速度快,传递速度也快,效率更高。
演示:
首先在unity工程项目中需要导入这个dll文件:,这个dll文件我们需要去google或者github上面下载
,然后解压之后按照这个路径找到unity的,
,然后将我说的要用的dill文件导入到unity工程中就好了。当然我在这里为了大家方便,也直接提供下载好的地址:
链接:http://pan.baidu.com/s/1pKSSTIz 密码:jv88
在项目中使用Protobuf主要学会怎么去学会序列化和反序列化数据。
创建一个用户信息类脚本,一会儿我们将对这个脚本使用Protobuf进行序列化和反序列。
using UnityEngine;
using System.Collections;
using ProtoBuf; //注意命名空间的引用
[ProtoContract] //表示当前类的数据遵循Protobuf的数据格式进行传输 竟然要使用必须加这个特性
public class UserInfo {
[ProtoMember(1)] //注意int标签的不重复
public int ID { get; set; }
[ProtoMember(2)]
public string UserName { get; set; }
[ProtoMember(3)]
public string PassWord { get; set; }
[ProtoMember(4)]
public int Level { get; set; }
[ProtoMember(5)]
public TypeTest UserTypeTest { get; set; }
public enum TypeTest
{
MASTER,
WARRIOR
}
}
主要标签的不要重复。接下来我们对这个用户信息类进行序列化和反序列。
序列化:
void Start () {
UserInfo userInfo=new UserInfo();
userInfo.ID = 123;
userInfo.Level = 95;
userInfo.UserName = "youmujun";
userInfo.PassWord = "123456";
using (var fs=File.Create(Application.dataPath+"/userinfo.bin"))
{
//使用Protobuf序列化文件
Serializer.Serialize<UserInfo>(fs,userInfo);
}
}
运行之后,工程文件夹下面便多了一个我们序列化的数据出来,
反序列化数据:
void Start ()
{
UserInfo userInfo = null;
using (var fs=File.OpenRead(Application.dataPath+"/userinfo.bin"))
{
//反序列化
userInfo = Serializer.Deserialize<UserInfo>(fs);
}
//打印出反序列后的数据
print(userInfo.UserName);
}
最后,上传一个最近项目中用到的Protobuf解析数据的代码片段:
//发送Protobuf数据
private void RequestRankdData(PlayerEvent vardata)
{
PlayerEventEx<PBMessage.GM_AllRankListRequest> tempRdata = vardata as PlayerEventEx<PBMessage.GM_AllRankListRequest>;
//发包
mPlayer.SendProtoBuf<PBMessage.GM_AllRankListRequest>((int)GameMessage.GM_ALLRANKLIST_REQUEST, tempRdata.GetData());
}
public static T DeserializeProtoBuf<T>(NetPacket packet) where T : class, ProtoBuf.IExtensible
{
Byte[] buffer = packet.getBuffer();
if (buffer == null)
{
return null;
}
using (MemoryStream ms = new MemoryStream(buffer,NetPacket.PACK_HEAD_SIZE,buffer.Length-NetPacket.PACK_HEAD_SIZE))
{
#if UserProCode
T newbuild = ProtoBuf.Serializer.Deserialize<T> (ms);
return newbuild;
#else
return new PBMessageSerializer().Deserialize(ms, null, typeof(T)) as T;
#endif
}
}
其实就是这么用的,是不是很简单!核心就是上面上面的那个例子里面的那些功能,看着复杂只不过是因为做了更进一步的封装和扩展而已!