主要是使用Marshal类里的两个方法:

第一个是StructureToPtr,将数据从托管对象封送到非托管内存块。

第二个是PtrToStructure,将数据从非托管内存块封送到新分配的指定类型的托管对象。

只要有了这两个相互转换的方法,我们就可以实现序列化了。

首先我们先来看下序列化

序列化:
有一个前提条件,那就是我们必须要知道需要序列化对象的大小。

第一步:我们先求出对象的大小,然后在非托管内存中给它分配相应的内存大小。

第二步:接着我们就把这个对象封送到刚分配出来的内存中,之后我们会得到一个分配出来的内存块首地址指针。

第三步:最后我们可以通过这个首地址指针,从指针所指的位置处开始,拷贝数据到指定的byte[]数组中,拷贝的长度就是我们为这个对象分配出来的内存大小,得到byte[]数据后,下面的事情我就不用多说了,你可以保存到数据库或者文件中。

反序列化:
序列化的时候我们先将一个对象封送到了非托管内存块中,然后再把内存块中的数据读到byte[]数组中,

现在我们反序列化

第一步:我们先求出对象的大小,然后在非托管内存中给它分配相应的内存大小。

第二步:然后把这个byte[]数据拷贝到非托管内存块中。

第三步:最后再从内存块中封送指定大小的数据到对象中。

有一个地方需要注意,那就是因为引用类型的对象我们是无法求的它的实际大小的,所以这里的对象我们只能使用非托管对象,比如struct结构体。

所以,当我们只是用来存储数据,不涉及任何操作的对象,我们可以把它作为一个结构体来处理,这样我们在序列化的时候可以节省空间开销。

因为你如果你要是用平常的序列化方法去序列化一个类对象,他所需要的空间开销是要大于你去序列化一个具有相同结构的struct对象。

下面是代码:


  1. public static class MyConverter

  2. {

  3. /// <summary>

  4. /// 由结构体转换为byte数组

  5. /// </summary>

  6. public static byte[] StructureToByte<T>(T structure)

  7. {

  8. int size = Marshal.SizeOf(typeof(T));

  9. byte[] buffer = new byte[size];

  10. IntPtr bufferIntPtr = Marshal.AllocHGlobal(size);

  11. try

  12. {

  13. Marshal.StructureToPtr(structure, bufferIntPtr, true);

  14. Marshal.Copy(bufferIntPtr, buffer, 0, size);

  15. }

  16. finally

  17. {

  18. Marshal.FreeHGlobal(bufferIntPtr);

  19. }

  20. return buffer;

  21. }

  22. /// <summary>

  23. /// 由byte数组转换为结构体

  24. /// </summary>

  25. public static T ByteToStructure<T>(byte[] dataBuffer)

  26. {

  27. object structure = null;

  28. int size = Marshal.SizeOf(typeof(T));

  29. IntPtr allocIntPtr = Marshal.AllocHGlobal(size);

  30. try

  31. {

  32. Marshal.Copy(dataBuffer, 0, allocIntPtr, size);

  33. structure = Marshal.PtrToStructure(allocIntPtr, typeof(T));

  34. }

  35. finally

  36. {

  37. Marshal.FreeHGlobal(allocIntPtr);

  38. }

  39. return (T)structure;

  40. }

  41. }

  42. //测试代码///

  43. class Program

  44. {

  45. static void Main(string[] args)

  46. {

  47. Student student1 = new Student { Name = "胡昌俊", ID = 2 };

  48. Console.WriteLine("序列化前=> 姓名:{0} ID:{1}", student1.ID, student1.Name);

  49. byte[] bytes = MyConverter.StructureToByte<Student>(student1);

  50. Student sudent2 = MyConverter.ByteToStructure<Student>(bytes);

  51. Console.WriteLine("序列化后=> 姓名:{0} ID:{1}", sudent2.ID, sudent2.Name);

  52. Console.Read();

  53. }

  54. }

  55. public struct Student

  56. {

  57. public int ID { get; set; }

  58. public string Name { get; set; }

  59. }

C#-利用Marshal类实现序列化相关推荐

  1. java marshal 序列化_求教Marshal类实现序列化出现的问题

    小弟最近在研究利用Marshal实现序列化和反系列化,主要是使用Marshal类里的两个方法,StructureToPtr和PtrToStructure,这两个类的具体讲解和用法我就不多赘述 了,具体 ...

  2. python marshal loads failed_Python模块学习:marshal 对象的序列化

    有时候,要把内存中的一个对象持久化保存到磁盘上,或者序列化成二进制流通过网络发送到远程主机上.Python中有很多模块提供了序列化与反序列化的功能,如:marshal, pickle, cPickle ...

  3. python字典序列化是什么意思_python序列化中的字符串,列表,字典,类的序列化解释...

    python序列化中的字符串,列表,字典,类的序列化解释 yuaneuro • 2020 年 03 月 07 日 我们知道现在各大语言都有其序列化数据和反序列的方式, 比如php的serialize和 ...

  4. 关于Marshal 类的整理

    原文转载于:https://www.cnblogs.com/DragonX/p/3474251.html 在两个不同的实体(两个线程或者进程甚至机器.在Managed和Unmanaged之间)进行方法 ...

  5. Marshal类的使用

    M a r s h a l 类 的 使 用 Marshal类的使用 Marshal类的使用 https://docs.microsoft.com/zh-cn/dotnet/api/system.run ...

  6. 企业如何利用新闻类软文营销策划

    新闻软文营销对企业的推广有哪些优势呢? 一.首先让客户有机会直接在门户网上相关频道看到关于企业产品的新闻,产生直接的点击或者评论,带来直接客户. 二.当潜在客户运用百度等搜索引擎搜索企业的公司名或者产 ...

  7. 利用WebClient类向服务器上载文件(转孟子的)

    利用WebClient类向服务器上载文件(转孟子的) 今天看了TERRYLEE老大的一篇写上传的.里面有个WEBCLIENT我就上网查了一下,找到孟子大人的一篇文章.感觉不错,就转了过来.大家一起学习 ...

  8. C# “Thread类Suspend()与Resume()已过时” 解决方法(利用ManualResetEvent类)

    C# "Thread类Suspend()与Resume()已过时" 解决方法(利用ManualResetEvent类) 参考文章: (1)C# "Thread类Suspe ...

  9. C# Marshal类基本概念和入门示例程序

    marshal:直译为"编排", 在计算机中特 指将数据按某种描述格式编排出来,通常来说一般是从非文本格式到文本格式的数据转化. unmarshal是指marshal的逆过程.比如 ...

最新文章

  1. tornado压力测试
  2. Android移动开发之【Android实战项目】剑走偏锋-得会导入别人的Android Studio项目!
  3. 解决warning LNK1166: cannot adjust code之掩耳盗铃版
  4. 客户端命令(docker)
  5. ​软件推荐:17 款必备Chrome浏览器插件,值得一试!
  6. LeetCode 530二叉搜索树的最小绝对值差-简单
  7. greenplum 查询出来的数字加减日期_Python实践代码总结第5集(日期相关处理)
  8. python做统计_利用 Python 进行统计
  9. leveldb java实例_EZDB首页、文档和下载 - LevelDB 的 Java 封装 - OSCHINA - 中文开源技术交流社区...
  10. 如何获得CSDN深色模式(基于Edge的强制深色获取)
  11. pynq 环境搭建_蚂蚁S9矿板ZYNQ7010开发板移植PYNQ_2.5
  12. 解读Scorm(0):标准
  13. PC通过adb连接手机 无需root连接 需要root连接
  14. win10环境下如何安装CAD
  15. html dom onblur,html DOM Event对象onblur事件
  16. Python生成验证码图片及验证用户提交的验证码是否正确
  17. 董事长和总经理的最大区别
  18. 写给大家看的CSS书,写给大家看的设计书
  19. 58 Hive案例(访问时长统计)
  20. 一阶常微分方程(二)|全微分方程+线性方程+常数易变法+伯努力方程

热门文章

  1. 打家劫舍(首尾相连)Python解法
  2. python学习-类(类方法、实例方法、静态方法)
  3. idea中生成spring的 xml配置文件_【132期】面试再被问到Spring容器IOC初始化过程,就拿这篇文章砸他~...
  4. centos图形化桌面的文件在哪_Windows 远程连接 CentOS 7 图形化桌面
  5. 戴尔win10插耳机还外放_通州附近戴尔笔记本电脑维修哪家强-北京信维佳业科技有限公司...
  6. 模电这么学,谁还会说不懂晶体管?
  7. Linux系统如何测试电脑性能,如何使用DD命令测试Linux磁盘的性能?
  8. 基于verilog贪吃蛇游戏设计
  9. 论MOS管开关对电源的影响
  10. 细说php这么难懂,挺难懂的解决方法