Unity中使用Protobuf

2020-12-21 17:06发布

将.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按钮: 


运行生成的文件: 




作者:Czhenya

链接:https://czhenya.blog.csdn.net/article/details/78220465

来源:CSDN
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。