首先是.proto文件
message ItemInfo { enum ItemType // 物品类型
{ Consumable =1; Equipment = 2; Weapon = 3; Material = 4; }
required int32 itemID = 1; // 商品的ID
required string itemName = 2;
required int32 count = 3; // 购买个数
optional ItemType type = 4[default = Weapon]; //物品类型的字段
required int32 price = 5; }
//messageID用来表示此时接受到的字节数组使用哪个类来进行序列化
//socket通信的时候,需要在数据包的包头指定枚举数,来告诉服务器使用哪个类进行序列化包体
enum MessageID {
c2s_Item_Request = 1;
s2c_Item_Response = 2; }
序列化和反序列化脚本
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using ProtoBuf;
using System.IO;
// 是用来做序列化跟反序列化
/* 序列化:对象转字节数组 反序列化:字节数组转对象 */
public class Serialize_Deserialize
{ // 序列化 public static byte[] Serialize(IExtensible msg)
{ byte[] result;
using (MemoryStream stream = new MemoryStream())
{ // 序列化:将msg进行protobuf序列化存放到stream中
Serializer.Serialize(stream, msg);
// 转字节数组
result = stream.ToArray(); }
return result; }
// 反序列化
public static T Deserialize(byte[] bytes)
{ T msg;
using (MemoryStream stream = new MemoryStream(bytes))
{ msg = Serializer.Deserialize(stream); }
return msg; } }
实例使用
using UnityEngine;
using proto.Item;
public class GameController : MonoBehaviour
{void Start ()
{ ItemInfo item0 = new ItemInfo();
item0.itemName = "腰带";
item0.itemID = 2001;
item0.count = 2;
item0.price = 200;
item0.type = ItemInfo.
ItemType.Consumable;
// 比如需要将以上的对象信息发送给服务器,需要使用protobuf进行序列化
byte[] itemBytes = Serialize_Deserialize.Serialize(item0);
// 反序列化
ItemInfo info = Serialize_Deserialize.Deserialize(itemBytes);
print (info.itemName); } }