Unity中使用Protobuf

将.proto文件转换成.cs文件,
教程:http://blog.csdn.net/czhenya/article/details/78216281 然后将转换后的.cs文件放到Unity中,而后将protobuf-net.dll 文件

下载链接。没有积分的同学,扫描主页左侧二维码或 V信搜 " 开发同学留步",回复“ ProtoGen”或者“PG” 获取资源。

文件放入相同的文件夹中,,,

然后编写如下代码:

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按钮:
111

运行生成的文件:
222

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈言必行

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值