最近公司需要將以前的協議全都改成ProtoBuf生成的協議,再將結構體打包和解包過程終於到一些問題 ,無法使用Marshal.SizeOf計算結構體大小,最后找了一下ProtoBuf的文檔,可以用它自帶的序列化和反序列化方法解決問題。
下面分享一下方法吧。
1 /// <summary> 2 /// 將消息序列化為二進制的方法 3 /// </summary> 4 /// <param name="meg">要序列化的對象</param> 5 /// <returns></returns> 6 public static byte[] Serizlize(object meg) 7 { 8 try 9 { 10 //涉及格式轉換,需要用到流,將二進制序列化到流中 11 using (MemoryStream ms = new MemoryStream()) 12 { 13 //使用ProtoBuf工具的序列化方法 14 ProtoBuf.Serializer.Serialize(ms, meg); 15 16 //定義二級制數組,保存序列化后的結果 17 byte[] result = new byte[ms.Length]; 18 //將流的位置設為0,起始點 19 //ms.Seek(0, SeekOrigin.Begin); 20 ms.Position = 0; 21 //將流中的內容讀取到二進制數組中 22 ms.Read(result, 0, result.Length); 23 24 return result; 25 } 26 } 27 catch (Exception ex) 28 { 29 return null; 30 } 31 } 32 /// <summary> 33 /// 將收到的消息反序列化成對象 34 /// </summary> 35 /// <param name="msg">收到的消息</param> 36 /// <returns></returns> 37 public static object DeSerizlize<T>(byte[] msg) 38 { 39 try 40 { 41 using (MemoryStream ms = new MemoryStream()) 42 { 43 //將消息寫入流中 44 ms.Write(msg, 14, msg.Length-14); 45 //將流的位置歸0 46 ms.Position = 0; 47 //使用工具反序列化對象 48 object mm = ProtoBuf.Serializer.Deserialize<T>(ms); 49 return mm; 50 51 } 52 } 53 catch (Exception ex) 54 { 55 return null; 56 } 57 }
