将.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按钮:
运行生成的文件: