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

本文介绍如何在Unity中使用Protobuf进行数据序列化和反序列化,包括所需DLL文件的导入、用户信息类的设计及序列化过程。此外,还提供了实际项目中使用Protobuf的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值