unity 简单使用protobuf

研究了下protobuf    用我的理解 解释下 protobuf是和json,xml 一样的存储数据的, 而它比json等小 在传送数据时更轻  一堆白话 不去用百度上边的专业术语 让一些没接触的人 更方便理解

那么如何在untiy里面用呢 我就不用给你讲那么多操作了 直接给你现成的。 当然你也可以自己去git上下载,然后编译。

第一

        要在unity的Plugins文件夹下导入protobuf的库protobuf-net.dll 我下面的网盘地址提供了这个文件

http://pan.baidu.com/s/1gfePUKV

第二 

你要去学习protobuf 可以看看这篇文章      http://blog.csdn.net/csdn_cjt/article/details/75151019   主要看看标量数值类型和如何编写一个 .proto 文件   我这里给大家提供一个proto文件   PersonInfo.proto    网盘地址是  http://pan.baidu.com/s/1bpcWsJ9

第三

    要把这个PersonInfo.proto 转换成c#文件 需要Protogen.exe 我这里也提供给大家 这是问一个朋友Blue要的现成的 网盘地址是 http://pan.baidu.com/s/1eRC1LIU 然后把转换的.cs文件放到你的项目里(注意自己写个文件夹专门放这一类c# 就是.cs文件)

      这个过程的操作是 要用DOS命令       请注意看下面的图

第四

        下面就是C#敲点代码的事情了

       首先你要搭建一个用protobuf序列化反序列化的类  ProtobufHelper.cs 就像下面这样

using System.Text;
using System.IO;
using ProtoBuf;

namespace Protobuf
{
    class ProtobufHelper
    {
        /// <summary>
        /// 序列化成string
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="t"></param>
        /// <returns>返回字符串</returns>
        public static string Serialize<T>(T t)
        {
            using (MemoryStream ms = new MemoryStream())
            {
                Serializer.Serialize<T>(ms, t);

                return Encoding.UTF8.GetString(ms.ToArray());
            }
        }

         /// <summary>
         /// 将消息序列化为二进制的方法
         /// </summary>
         /// <param name="model">要序列化的对象</param>
         public static  byte[] Serialize1<T>(T t){
            using (MemoryStream ms = new MemoryStream())
            {
                Serializer.Serialize<T>(ms, t);

                //定义二级制数组,保存序列化后的结果
                byte[] result = new byte[ms.Length];
                //将流的位置设为0,起始点
                ms.Position = 0;
                //将流中的内容读取到二进制数组中
                ms.Read (result, 0, result.Length);
                return result;
            }
         }

        /// <summary>
        /// 序列化到文件
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="path"></param>
        /// <param name="data"></param>
        public static void Serialize<T>(string path, T data)
        {
            using (Stream file = File.Create(path))
            {
                Serializer.Serialize<T>(file, data);
                file.Close();
            }
        }

        /// <summary>
        /// 根据字符串反序列化成对象
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="content"></param>
        /// <returns></returns>
        public static T DeSerialize<T>(string content)
        {
            using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(content)))
            {
                T t = Serializer.Deserialize<T>(ms);
                return t;
            }
        }

        /// <summary>
        /// 根据文件流返回对象
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="filestream"></param>
        /// <returns></returns>
        public static T DeSerialize<T>(Stream filestream)
        {
            return Serializer.Deserialize<T>(filestream);
        }


     

         

    }
}

当你要发送数据的时候 比如用socket给服务器发送数据的时候 

就可以这样用


ClientSocket.Send(ProtobufHelper.Serialize(new Person() { Name = this.PlayName, Gender = true, Msg = message }));

同样接受的消息用上面的ProtobufHelper里面的方法去反序列化服务器接受的信息

当然你自己搭建个socket或者http测试下


基本上研究了半天就弄了这么点东西 看了一些博客的东西借鉴了一些东西,看了一些操作。

谢谢先人的分享,我也走在分享的道路上






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值