C#使用Protocol Buffer(ProtoBuf)进行对象的序列化与反序列化

Protocol Buffer是Google开发的数据格式,也是除了XML和JSON之外人气第三高的^^需要的朋友可以参考下


首先来说一下本文中例子所要实现的功能:

  • 基于ProtoBuf序列化对象

下面来看具体的步骤:

Unity中使用ProtoBuf

导入DLL到Unity中,
创建网络传输的模型类:

using System;
using ProtoBuf;
 
//添加特性,表示可以被ProtoBuf工具序列化
[ProtoContract]
public class NetModel {
 //添加特性,表示该字段可以被序列化,1可以理解为下标
 [ProtoMember(1)] 
 public int ID;
 [ProtoMember(2)]
 public string Commit;
 [ProtoMember(3)]
 public string Message;
}
using ProtoBuf;的引用需要使用protobuf-net.dll动态链接库文件

将这个DLL文件放入Plugins文件夹下就行

整个示例代码如下:

using UnityEngine;
using System;
using ProtoBuf;
using System.IO;
using System.Collections;

//添加特性,表示可以被ProtoBuf工具序列化
[ProtoContract]
public class NetModel {
	//添加特性,表示该字段可以被序列化,1可以理解为下标
	[ProtoMember(1)] 
	public int ID;
	[ProtoMember(2)]
	public string Commit;
	[ProtoMember(3)]
	public string Message;
}


public class ProtocolBuffer : MonoBehaviour {

	// Use this for initialization
	void Start () {
		Test ();
	}

	void Test()
	{
		//创建对象
		NetModel item = new NetModel(){ID = 1, Commit = "LanOu", Message = "Unity"};
		//序列化对象
		byte[] temp = Serialize(item);
		//ProtoBuf的优势一:小
		Debug.Log(temp.Length);
		//反序列化为对象
		NetModel result = DeSerialize(temp);
		Debug.Log(result.Message);
	}

	// 将消息序列化为二进制的方法
	// < param name="model">要序列化的对象< /param>
	private byte[] Serialize(NetModel model)
	{
		try {
			//涉及格式转换,需要用到流,将二进制序列化到流中
			using (MemoryStream ms = new MemoryStream()) {
				//使用ProtoBuf工具的序列化方法
				ProtoBuf.Serializer.Serialize (ms, model);
				//定义二级制数组,保存序列化后的结果
				byte[] result = new byte[ms.Length];
				//将流的位置设为0,起始点
				ms.Position = 0;
				//将流中的内容读取到二进制数组中
				ms.Read (result, 0, result.Length);
				return result;
			}
		} catch (Exception ex) {
			Debug.Log ("序列化失败: " + ex.ToString());
			return null;
		}
	}

	// 将收到的消息反序列化成对象
	// < returns>The serialize.< /returns>
	// < param name="msg">收到的消息.
	private NetModel DeSerialize(byte[] msg)
	{
		try {
			using (MemoryStream ms = new MemoryStream()) {
				//将消息写入流中
				ms.Write (msg, 0, msg.Length);
				//将流的位置归0
				ms.Position = 0;
				//使用工具反序列化对象
				NetModel result = ProtoBuf.Serializer.Deserialize (ms);
				return result;
			}
		} catch (Exception ex) {  
			Debug.Log("反序列化失败: " + ex.ToString());
			return null;
		}
	}
}





你可能感兴趣的:(文件操作)