最近公司需要将以前的协议全都改成ProtoBuf生成的协议,再将结构体打包和解包过程终于到一些问题 ,无法使用Marshal.SizeOf计算结构体大小,最后找了一下ProtoBuf的文档,可以用它自带的序列化和反序列化方法解决问题。
下面分享一下方法吧。
1 ///
2 /// 将消息序列化为二进制的方法
3 ///
4 /// 要序列化的对象
5 ///
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 ///
33 /// 将收到的消息反序列化成对象
34 ///
35 /// 收到的消息
36 ///
37 public static object DeSerizlize
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
49 return mm;
50
51 }
52 }
53 catch (Exception ex)
54 {
55 return null;
56 }
57 }