socket傳輸protobuf位元組流執行個體教程

來源:互聯網
上載者:User
著作權聲明:本文為原創文章,轉載請聲明

近期在做一個棋牌項目,需要用到socket傳輸protobuf位元組流,在網上找了一些部落格和文章後發現,沒有特別全面的,所以把自己研究的全部源碼拿出來和大家分享,因為剛開始做,可能會有不足的地方,歡迎拍磚~~

這一篇主要是protocol buffer檔案的序列化和解析,廢話不多說了,直接上乾貨

 1 /// <summary> 2 /// 將訊息序列化為二進位的方法 3 /// </summary> 4 /// <param name="model">要序列化的對象</param> 5 public static byte[] Serialize(IExtensible model) 6 { 7   try 8   { 9     //建立流對象10     MemoryStream ms = new MemoryStream()11     //使用ProtoBuf內建的序列化工具序列化IExtensible對象12     Serializer.Serialize<IExtensible>(ms, model);13     //建立二級制數組,儲存序列化後的流14     byte[] bytes = new byte[ms.Length];15     //將流的位置設為016     ms.Position = 0;17     //將流中的內容讀取到位元組中18     ms.Read(bytes, 0, bytes.Length);19     return bytes;20   }21   catch (Exception e)22   {23     Debug.Log("序列化失敗: " + e.ToString());24     return null;25   }26 }

protobuf檔案中的每一條message經過protocol buffer提供的ProtoGen工具可以轉成c#的中的類,例如

message Test {    required string test1= 1;    required string test2= 2;}

經過轉化後就變成了

 1   [global::System.Serializable, global::ProtoBuf.ProtoContract(Name=@"SedReq")] 2   public partial class Test : global::ProtoBuf.IExtensible 3   { 4     public Test() {} 5      6     private string _test1; 7     [global::ProtoBuf.ProtoMember(1, IsRequired = true, Name=@"test1", DataFormat = global::ProtoBuf.DataFormat.Default)] 8     public string test1 9     {10       get { return _test1; }11       set { _test1 = value; }12     }    13     private string _test2;14     [global::ProtoBuf.ProtoMember(2, IsRequired = true, Name=@"test2", DataFormat = global::ProtoBuf.DataFormat.Default)]15     public string test216     {17       get { return _test2; }18       set { _test2 = value; }19     }20     private global::ProtoBuf.IExtension extensionObject;21     global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)22       { return global::ProtoBuf.Extensible.GetExtensionObject(ref extensionObject, createIfMissing); }23   }

無視所有帶global的代碼,你會發現,轉化後的c#類和一個標準的c#實體類一模一樣,並且,這些轉化後的類都繼承至ProtoBuf.IExtensible,所以上文中的序列化函數的參數的類型是IExtensible

有了序列化,當然還需要還原序列化,也就是講byte[]還原序列化為繼承至IExtensible的類型的對象

 1     /// <summary> 2     /// 將收到的訊息還原序列化成IExtensible對象 3     /// </summary> 4     /// <param name="msg">收到的訊息的位元組流.</param> 5     /// <returns></returns> 6     public static T DeSerialize<T>(byte[] bytes) where T : IExtensible 7     { 8         try 9         {10             MemoryStream ms = new MemoryStream()11             //將訊息寫入流中12             ms.Write(bytes, 0, bytes.Length);13             //將流的位置歸014             ms.Position = 0;15             //還原序列化對象16             T result = Serializer.Deserialize<T>(ms);17             return result;18         }19         catch (Exception e)20         {21             Debug.Log("還原序列化失敗: " + e.ToString());22             return null;23         }24     }

因為還原序列化後的對象是繼承至IExtensible的類的對象,所以傳回值必須使用泛型約束來定義,這樣才能保證函數的通用性

工具搞定,接下來就是測試代碼了

1     public void Test()2     {3         Test test = new Test() { test1 = "123", test2 = "456" };4         byte[] bytes = Serialize(test);5         Test test2 = DeSerialize<Test>(bytes);6         Debug.Log(test2.test1 + test2.test2);7     }

輸出結果 123456

附上protobuf-net.dll檔案


先行編譯和轉化工具

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.