您的位置:首页 > 移动开发 > Unity3D

Unity常见的解析数据方式XML,JSON,ProtocolBuf篇(一)Protobuf

2016-12-13 14:43 459 查看
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);
}

}

运行之后,工程文件夹下面便多了一个我们序列化的数据出来,

,这样我们需要向服务器发送就给发送了,因为是二进制文件,所以传输速度会很快,如果我们从服务器上面接收到了按照Protobuf数据格式回传的数据呢?那时候该怎么处理呢?比如玩家登陆游戏,玩家事件管理器想服务器发包请求排行榜数据,当玩家打开排行榜数据的时候,数据ui显示,这里就涉及了解析服务器数据了,还是通过解析这个useinfo数据,来了解Protobuf在项目当中是怎么解析数据的。

反序列化数据:

void Start ()
{
UserInfo userInfo = null;
using (var fs=File.OpenRead(Application.dataPath+"/userinfo.bin"))
{
//反序列化
userInfo = Serializer.Deserialize<UserInfo>(fs);
}
//打印出反序列后的数据
print(userInfo.UserName);
}


那么经过测试,我们发现成功的将一个按照Protobuf数据格式序列化的二进制数据文件反序列了出来,并且打印出了其中的内容之一。



最后,上传一个最近项目中用到的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());
}


//解析Protobuf数据

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

}
}


其实就是这么用的,是不是很简单!核心就是上面上面的那个例子里面的那些功能,看着复杂只不过是因为做了更进一步的封装和扩展而已!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: