ProtoBuf序列化和反序列化方法

时间:2022-10-16 16:00:25

最近公司需要将以前的协议全都改成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         }