socket怎樣傳輸protobuf字節(jié)流

小編給大家分享一下socket怎樣傳輸protobuf字節(jié)流,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

公司主營業(yè)務:網(wǎng)站設計制作、網(wǎng)站設計、移動網(wǎng)站開發(fā)等業(yè)務。幫助企業(yè)客戶真正實現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。創(chuàng)新互聯(lián)是一支青春激揚、勤奮敬業(yè)、活力青春激揚、勤奮敬業(yè)、活力澎湃、和諧高效的團隊。公司秉承以“開放、自由、嚴謹、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領域給我們帶來的挑戰(zhàn),讓我們激情的團隊有機會用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)推出藁城免費做網(wǎng)站回饋大家。

示例

 1 /// <summary> 2 /// 將消息序列化為二進制的方法 3 /// </summary> 4 /// <param name="model">要序列化的對象</param> 5 public static byte[] Serialize(IExtensible model) 6 { 7   try 8   { 9     //創(chuàng)建流對象10     MemoryStream ms = new MemoryStream()11     //使用ProtoBuf自帶的序列化工具序列化IExtensible對象12     Serializer.Serialize<IExtensible>(ms, model);13     //創(chuàng)建二級制數(shù)組,保存序列化后的流14     byte[] bytes = new byte[ms.Length];15     //將流的位置設為016     ms.Position = 0;17     //將流中的內容讀取到二進制數(shù)組中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經(jīng)過protocol buffer提供的ProtoGen工具可以轉成c#的中的類,例如

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

經(jīng)過轉化后就變成了

 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的代碼,你會發(fā)現(xiàn),轉化后的c#類和一個標準的c#實體類一模一樣,并且,這些轉化后的類都繼承至ProtoBuf.IExtensible,所以上文中的序列化函數(shù)的參數(shù)的類型是IExtensible

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

 1     /// <summary> 2     /// 將收到的消息反序列化成IExtensible對象 3     /// </summary> 4     /// <param name="msg">收到的消息的字節(jié)流.</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的類的對象,所以返回值必須使用泛型約束來定義,這樣才能保證函數(shù)的通用性

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

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

以上是“socket怎樣傳輸protobuf字節(jié)流”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

新聞名稱:socket怎樣傳輸protobuf字節(jié)流
本文地址:http://muchs.cn/article26/pieccg.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供服務器托管、品牌網(wǎng)站建設、建站公司、域名注冊、、品牌網(wǎng)站設計

廣告

聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設