美文网首页
protobuf需要的脚本都在这里

protobuf需要的脚本都在这里

作者: 王一1 | 来源:发表于2018-05-29 21:49 被阅读0次

首先是.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); }  }

相关文章

网友评论

      本文标题:protobuf需要的脚本都在这里

      本文链接:https://www.haomeiwen.com/subject/mtkzjftx.html