天天看點

unity3d中ProtoBuf的序列化和反序列化c#

using System;
using System.IO;
using ProtoBuf;

namespace SensorServerPro
{
    class Common
    {
        /// <summary>
        /// 傳遞過來的類型序列化成byte[]
        /// </summary>
        /// <typeparam name="T">傳遞的類型</typeparam>
        /// <param name="instance">類型對象</param>
        /// <returns>傳回instance轉換成的byte[]</returns>
        public static byte[] Serialize<T>(T instance)
        {
            byte[] bytes = null;
            using (var ms = new MemoryStream())
            {
                Serializer.Serialize<T>(ms, instance); //ms流對象,instance轉換成byte數組會存儲在ms裡面。《序列化》
                bytes = new byte[ms.Position]; //為bytes執行個體化一個長度(傳遞過來的類型轉換成(byte)數組之後的長度)ms.position(ms流對象的長度)
                var fullBytes = ms.GetBuffer(); //擷取儲存在記憶體流裡面的位元組資料
                Array.Copy(fullBytes, bytes, bytes.Length); //将儲存在 fullBytes記憶體流裡的資料拷貝到bytes裡。
            }
            return bytes;
        }

        /// <summary>
        /// 将傳遞過來的bytes[]反序列化成T類型
        /// </summary>
        /// <typeparam name="T">反序列化成的類型</typeparam>
        /// <param name="bytes">byte[]</param>
        /// <returns>傳回一個定義好的類型,内部存儲要傳輸的資料</returns>
        public static T DeSerialize<T>(byte[] bytes)
        {
            using (var  ms=new MemoryStream(bytes)) //(聲明一個記憶體流對象)
            {
                return Serializer.Deserialize<T>(ms); //《反序列化》
            }
        }

    }
}
           
using ProtoBuf;
           
[ProtoContract]
    class PlayerData
    {
        [ProtoMember(1)]
        public float px { get; set; }
        [ProtoMember(2)]
        public float py { get; set; }
        [ProtoMember(3)]
        public float pz { get; set; }
        [ProtoMember(4)]
        public float rx { get; set; }
        [ProtoMember(5)]
        public float ry { get; set; }
        [ProtoMember(6)]
        public float rz { get; set; }

    }
           
當然,在進行系列操作的時候你還需要先導入ProtoBuf的Dll檔案。檔案我這裡就不上傳了百度的到的