Unity中使用Protobuf

来源:互联网 发布:淘宝店铺装修计划 编辑:程序博客网 时间:2024/06/06 12:20

将.proto文件转换成.cs文件,教程:http://blog.csdn.net/czhenya/article/details/78216281
然后将转换后的.cs文件放到Unity中,然后将protobuf-net.dll 文件 (链接:http://pan.baidu.com/s/1nveIOit 密码:w4fz )文件放入相同的文件夹中,,,
然后编写如下代码:

using Desktop.ProtoGen.Test;   //注意引用Person类的命名空间 和下面Person类的对应using System.Collections.Generic;using System.IO;using UnityEngine;public class ProtobufDemo : MonoBehaviour {    private string path;    // Use this for initialization    void Start () {        //存储序列化文件名        path = Application.dataPath + "TestDemo";    }    void OnGUI()    {        if (GUILayout.Button("Protobuf序列化"))        {            Person person1 = new Person() { Name = "Czhenya", Age = 12 };            Person person2 = new Person() { Name = "CZY", Age = 31 };            List<Person> PerList = new List<Person>() { person1, person2 };            string strRel = ProtobufHelp.Serialize<List<Person>>(PerList);            ProtobufHelp.Serialize<List<Person>>(path, PerList);            Debug.Log("序列化成功了,生成文件名为TestDemo");        }        if (GUILayout.Button("Protobuf反序列化"))        {            Debug.Log("反序列化,获取出序列化文件中的信息");            FileInfo info = new FileInfo(path);            Stream sf = info.OpenRead();            List<Person> NewPerList = ProtobufHelp.DeSerialize<List<Person>>(sf);            for (int i = 0; i < NewPerList.Count; i++)            {                Debug.Log(NewPerList[i].ToString());            }        }    }}

使用软件转换成.cs的文件

namespace Desktop.ProtoGen.Test   //上面引用的命名空间{  [global::System.Serializable, global::ProtoBuf.ProtoContract(Name=@"Person")]  public partial class Person : global::ProtoBuf.IExtensible  {    public Person() {}        public override string ToString()        {            return Name + "-" + Age;        }        private string _Name;    [global::ProtoBuf.ProtoMember(1, IsRequired = true, Name=@"Name", DataFormat = global::ProtoBuf.DataFormat.Default)]    public string Name    {      get { return _Name; }      set { _Name = value; }    }    private int _Age = default(int);    [global::ProtoBuf.ProtoMember(2, IsRequired = false, Name=@"Age", DataFormat = global::ProtoBuf.DataFormat.TwosComplement)]    [global::System.ComponentModel.DefaultValue(default(int))]    public int Age    {      get { return _Age; }      set { _Age = value; }    }    [global::ProtoBuf.ProtoContract(Name=@"TypeEnum")]    public enum TypeEnum    {      [global::ProtoBuf.ProtoEnum(Name=@"Web", Value=1)]      Web = 1,      [global::ProtoBuf.ProtoEnum(Name=@"Ios", Value=2)]      Ios = 2,      [global::ProtoBuf.ProtoEnum(Name=@"News", Value=3)]      News = 3    }    private global::ProtoBuf.IExtension extensionObject;    global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)      { return global::ProtoBuf.Extensible.GetExtensionObject(ref extensionObject, createIfMissing); }  }}

Protobuf帮助文档:(核心)

using ProtoBuf;using System.IO;using System.Text;using UnityEngine;public class ProtobufHelp : MonoBehaviour {    /// <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>    /// <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);    }}

第一个脚本挂载到有物体上运行依次点击OnGUI按钮:
2

运行生成的文件:
1

原创粉丝点击