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

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
				
            }
		}


其实就是这么用的,是不是很简单!核心就是上面上面的那个例子里面的那些功能,看着复杂只不过是因为做了更进一步的封装和扩展而已!

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
using System; //需要用到MemoryStream using System.IO; using UnityEngine; //引入ProtoBuf命名空间 using ProtoBuf; /// /// 测试类 /// public class TestProtobuf : MonoBehaviour { /// /// 用于测试的数据类 /// [ProtoContract] //声明这个类能被序列化 public class UserData { //声明每一个需要被序列化的成员,编号从1开始 [ProtoMember(1)] public int id; [ProtoMember(2)] public string name; [ProtoMember(3)] public int level; } //测试代码 void Start() { //将要被序列化的UserData示例 UserData user1 = new UserData (); user1.id = 1; user1.name = "User1"; user1.level = 10; //打印user1 Debug.Log (string.Format ("user1-> id:{0}, name:{1}, level:{2}", user1.id, user1.name, user1.level)); //序列化 byte[] buff = null; using (MemoryStream ms = new MemoryStream ()) { Serializer.Serialize (ms, user1); ms.Position = 0; int length = (int)ms.Length; buff = new byte[length]; ms.Read (buff, 0, length); } //输出字节数组 Debug.Log (string.Format("Serialized data-> {0}", BitConverter.ToString(buff))); //反序列化 UserData user2 = default(UserData); using (MemoryStream ms = new MemoryStream (buff)) { user2 = Serializer.Deserialize (ms); } //打印反序列化生成的user2 Debug.Log (string.Format ("user2-> id:{0}, name:{1}, level:{2}", user2.id, user2.name, user2.level)); } } 作者:qufangliu 链接:https://www.jianshu.com/p/d9be1b3d2446 來源:简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值