您好,登錄后才能下訂單哦!
小編給大家分享一下socket怎樣傳輸protobuf字節(jié)流,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
示例
1 /// <summary> 2 /// 將消息序列化為二進(jìn)制的方法 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 //將流的位置設(shè)為016 ms.Position = 0;17 //將流中的內(nèi)容讀取到二進(jìn)制數(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工具可以轉(zhuǎn)成c#的中的類,例如
message Test { required string test1= 1; required string test2= 2; }
經(jīng)過轉(zhuǎn)化后就變成了
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),轉(zhuǎn)化后的c#類和一個標(biāo)準(zhǔn)的c#實(shí)體類一模一樣,并且,這些轉(zhuǎn)化后的類都繼承至ProtoBuf.IExtensible,所以上文中的序列化函數(shù)的參數(shù)的類型是IExtensible
有了序列化,當(dāng)然還需要反序列化,也就是講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 }
因?yàn)榉葱蛄谢蟮膶ο笫抢^承至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 }
輸出結(jié)果 123456
以上是“socket怎樣傳輸protobuf字節(jié)流”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。