Protobuf-net

来源:互联网 发布:如何倒时差 知乎 编辑:程序博客网 时间:2024/05/22 05:03

  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);//拷贝读取的消息到 消息接收数组//反序列化1MainPacket 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 );


0 1