在将对象或结构体序列化成二进制数据流时,我们通常都会使用 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter 类来实现,

但是这种方式会把对象或结构体的类型信息给序列化到数据流中, 在做通迅时,这种方式是不可取的.

在c/c++中,通常对某个协议使用 struct 进行存储,然后将其序列化, c#也能实现这样的功能. 具体的实现办法:

public static byte[] GetBytes<TStruct>(TStruct data) where TStruct : struct
{
int structSize = Marshal.SizeOf(typeof(TStruct));
byte[] buffer = new byte[structSize];
GCHandle handle = GCHandle.Alloc(buffer, GCHandleType.Pinned);
Marshal.StructureToPtr(data, handle.AddrOfPinnedObject(), false);
handle.Free();
return buffer;
}

作为参数的结构体,需要使用 [StructLayout] 和 [FieldOffset]分别声明结构体和结构体中的成员.通过上面的方法,可以将结构体中的成员序列化成

我们需要的二进制数据流. 大部分的需求都可以实现, 但目前,我还不太清楚,如果需要实现类似于c/c++中, 使用联合体作为结构体成员,该如果实现.

如果有人知道,请留言告知,谢谢!

  

最新文章

  1. sql 代码笔记
  2. 编译器--__attribute__ ((packed))
  3. [原创]Oracle 12c 抢先安装手迹
  4. 几个功能强大的系统源码(机票分销、机票预订、OA、手机充值、wifi营销、网络超市、体检平台)
  5. 2016年12月11日 php面向对象
  6. codeforces 719E E. Sasha and Array(线段树)
  7. C#设计模式(3):抽象工厂模式(Abstract Factory)(转载)
  8. Android中使用WebView与JS交互全解析
  9. Swift - iOS中各种视图控制器(View Controller)的介绍
  10. 【nodejs之我的开源module】 使用express搭建web服务器,代码即文档的实现。
  11. (1)xcode基本设置和控制器等介绍
  12. JSON创建键值对(key是中文或者数字)方式详解
  13. 老大哥在看着你!我国部署超2000万个AI监控系统
  14. QuickBI助你成为分析师——计算字段功能
  15. ssh网上商城源码
  16. 搭建rsync服务并同步重要数据
  17. LeetCode:94_Binary Tree Inorder Traversal | 二叉树中序遍历 | Medium
  18. android-基础编程-Preference
  19. .Net使用163smtp发送邮件时错误:邮箱不可用. has no permission解决方法
  20. 1.4《想成为黑客,不知道这些命令行可不行》(Learn Enough Command Line to Be Dangerous)——编辑命令

热门文章

  1. html颜色设定 - 网址不见了看这里
  2. 编译 ambari 2.7.3
  3. [CQOI2012][bzoj2668] 交换棋子 [费用流]
  4. Django 自定义模板标签 报错django.template.exceptions.TemplateSyntaxError: &#39;####&#39; is not a registered tag library. Must be one of:
  5. P4768 [NOI2018]归程
  6. 数据结构11: 栈(Stack)的概念和应用及C语言实现
  7. LUNA16数据集(一)简介
  8. 停止mysql服务
  9. mysql5.7脚本日常使用
  10. c语言字符函数