最近公司需要将以前的协议全都改成ProtoBuf生成的协议,再将结构体打包和解包过程终于到一些问题 ,无法使用Marshal.SizeOf计算结构体大小,最后找了一下ProtoBuf的文档,可以用它自带的序列化和反序列化方法解决问题。

下面分享一下方法吧。

   /// <summary>
/// 将消息序列化为二进制的方法
/// </summary>
/// <param name="meg">要序列化的对象</param>
/// <returns></returns>
public static byte[] Serizlize(object meg)
{
try
{
//涉及格式转换,需要用到流,将二进制序列化到流中
using (MemoryStream ms = new MemoryStream())
{
//使用ProtoBuf工具的序列化方法
ProtoBuf.Serializer.Serialize(ms, meg); //定义二级制数组,保存序列化后的结果
byte[] result = new byte[ms.Length];
//将流的位置设为0,起始点
//ms.Seek(0, SeekOrigin.Begin);
ms.Position = ;
//将流中的内容读取到二进制数组中
ms.Read(result, , result.Length); return result;
}
}
catch (Exception ex)
{
return null;
}
}
/// <summary>
/// 将收到的消息反序列化成对象
/// </summary>
/// <param name="msg">收到的消息</param>
/// <returns></returns>
public static object DeSerizlize<T>(byte[] msg)
{
try
{
using (MemoryStream ms = new MemoryStream())
{
//将消息写入流中
ms.Write(msg, , msg.Length-);
//将流的位置归0
ms.Position = ;
//使用工具反序列化对象
object mm = ProtoBuf.Serializer.Deserialize<T>(ms);
return mm; }
}
catch (Exception ex)
{
return null;
}
}

最新文章

  1. robotium教材(一):robotium环境搭建
  2. 170103、Redis官方集群方案 Redis Cluster
  3. selenium-JS点击(项目应用)
  4. iOS:使用代理模式监听开关状态改变事件
  5. Solr入门之(5)配置文件schema.xml
  6. Javascript基础系列之(一)JavaScript语法
  7. 自定义view(使用EditTetx实现记事本特效)
  8. javaScript动态参数
  9. sql语句查询重复的数据
  10. java基础知识回顾之java Socket学习(一)--UDP协议编程
  11. uva1639 Candy
  12. 普通Java程序员学习使用的6个JDK内建工具
  13. D3.js:坐标轴
  14. tomcat中session在两个webapp中实现共享
  15. java数据库(MySQL)之增删改查
  16. mac安装brew简单方法
  17. C# 中将月份格式化为英语缩写格式
  18. Paxos算法1-算法形成理论[转载]
  19. 如何从应用直接跳转AppStore 电话 短信 邮件
  20. javascript关于onclick()

热门文章

  1. 【校招面试 之 C/C++】第12题 C++ 重载、重写和重定义
  2. centos安装Python插件后找不到对应的插件ModuleNotFoundError: No module named*
  3. linux 下 php 安装 event
  4. Spring框架整合Struts2框架的传统方法
  5. 【SQL模板】二.创建表视图模板TSQL
  6. 在iframe框架中全屏不好使的原因
  7. 深入浅出 JMS(四) - ActiveMQ 消息存储
  8. com.opensymphony.xwork2.config.ConfigurationManager.addConfigurationProvider
  9. 1、GDB程序调试
  10. 使用RSA进行信息加密解密的WebService示例