Protobuf-net

  Protobuf 是google发起的一种二进制格式,目前广泛应用在各种开发语言中。详情请看:https://code.google.com/p/protobuf/点击打开链接,关于C#的Protobuf实现,目前公认比较好的就是Protobuf-net。

  因为GOOGLE自带支持的语言不包括C#,所以当使用了开元项目Protobuf-net解析google protobuf 格式的通信数据时,需要使用第三方开源库Protobuf-net。 下载地址:点击打开链接 https://github.com/mgravell/protobuf-net  

 1. 下载后可能会有很多文件,只需要复制protobuf-net到工程中即可。

 2.下载后建立一个文件smcs.rsp,内容是-unsafe,前后都不能有空格,放到Assets目录下即可。

 3.把工程设置为.Net 2.0 subset,因为.Net 2.0是无法在ios上用这个方法的

 4.重启unity。

也可直接导入unitypackage,下载地址:点击打开链接。(上面的1,2,3,4都不需要了)。

 下面简单介绍下序列化过程:

//生成数据
			MainPacket tempPacket = new MainPacket(){ header = HEADER,timestamp = timestamp,cmdCode = cmdCode,contentLength = contentLength,content = contentStr,tail = TAIL};
			byte[] buffer = null;
			using ( MemoryStream ms = new MemoryStream ( ) )
			{
				//将数据序列化
				Serializer.Serialize ( ms , tempPacket );
				ms.Position = 0;
				int length = (int)ms.Length;
				buffer = new byte[length];
				ms.Read(buffer, 0 ,length);

				//发送请求
				try
				{
					connectPanle.SetActive(true);
					socket.Send(buffer);
				}
				catch
				{
					connectPanle.SetActive(false);
					Debug.Log("socket error");
				}
			}

反序列化过程:

//读取消息长度
			readCount = socket.EndReceive(ar);//调用这个函数来结束本次接收并返回接收到的数据长度。 
			Debug.Log("读取消息长度" + readCount);
			byte[] bytes = new byte[readCount];//创建长度对等的bytearray用于接收
			Buffer.BlockCopy(readM, 0, bytes, 0, readCount);//拷贝读取的消息到 消息接收数组
			
			//反序列化1
			MainPacket s = new MainPacket();  
			MemoryStream ms = new MemoryStream();  
			ms.Write(bytes,0,readCount);  
			s = ProtoBuf.Serializer.Deserialize<MainPacket>(ms);  
			Debug.Log("错误代码:"+s.cmdCode);  


			// 对包头和包尾进行解析
			if(s.header != HEADER && s.tail != TAIL)
			{
				Debug.Log("非法包");
				return;
			}
			else
			{
				Debug.Log("执行成功");
				messages.Add(s);
			}

			//反序列化2
			//			MainPacket newData = null;
			//			using ( MemoryStream ms = new MemoryStream ( bytes ) )
			//			{
			//				newData =  ProtoBuf.Serializer.Deserialize<MainPacket>(ms);
			//			}
			//			Debug.Log ( "newData.cmdCode=" + newData.cmdCode );


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。