当前位置:网站首页>C # - realize serialization with Marshall class
C # - realize serialization with Marshall class
2022-07-06 19:16:00 【luckyone906】
Mainly used Marshal Two methods in class :
The first is StructureToPtr, Marshaling data from managed objects to unmanaged memory blocks .
The second is PtrToStructure, Marshals data from an unmanaged memory block to a newly allocated managed object of the specified type .
As long as there are these two methods of mutual transformation , We can realize serialization .
First, let's look at serialization
serialize :
There is a prerequisite , That is, we must know the size of the serialized object .
First step : Let's find out the size of the object first , Then allocate the corresponding memory size to it in unmanaged memory .
The second step : Then we will send this object to the memory just allocated , Then we will get a pointer to the first address of the allocated memory block .
The third step : Finally, we can use this first address pointer , Start at the position indicated by the pointer , Copy data to the specified byte[] Array , The length of the copy is the amount of memory we allocate for this object , obtain byte[] After the data , I don't need to say more about the following things , You can save to database Or in the file .
Deserialization :
When serializing, we first marshal an object into an unmanaged memory block , Then read the data in the memory block to byte[] Array ,
Now we deserialize
First step : Let's find out the size of the object first , Then allocate the corresponding memory size to it in unmanaged memory .
The second step : And put this byte[] Copy the data to an unmanaged memory block .
The third step : Finally, marshal the data of the specified size from the memory block to the object .
There is one thing to note , That is because we cannot find the actual size of an object of reference type , So we can only use unmanaged objects , such as struct Structure .
therefore , When we just use it to store data , Objects that do not involve any operations , We can treat it as a structure , In this way, we can save space when serializing .
Because if you use the usual serialization method to serialize a class object , It requires more space than you need to serialize a with the same structure struct object .
Here is the code :
public static class MyConverter{/// <summary>/// From structure to byte Array/// </summary>public static byte[] StructureToByte<T>(T structure){int size = Marshal.SizeOf(typeof(T));byte[] buffer = new byte[size];IntPtr bufferIntPtr = Marshal.AllocHGlobal(size);try{Marshal.StructureToPtr(structure, bufferIntPtr, true);Marshal.Copy(bufferIntPtr, buffer, 0, size);}finally{Marshal.FreeHGlobal(bufferIntPtr);}return buffer;}/// <summary>/// from byte The array is converted to a structure/// </summary>public static T ByteToStructure<T>(byte[] dataBuffer){object structure = null;int size = Marshal.SizeOf(typeof(T));IntPtr allocIntPtr = Marshal.AllocHGlobal(size);try{Marshal.Copy(dataBuffer, 0, allocIntPtr, size);structure = Marshal.PtrToStructure(allocIntPtr, typeof(T));}finally{Marshal.FreeHGlobal(allocIntPtr);}return (T)structure;}}// Test code ///class Program{static void Main(string[] args){Student student1 = new Student { Name = " Huchangjun ", ID = 2 };Console.WriteLine(" Before serialization => full name :{0} ID:{1}", student1.ID, student1.Name);byte[] bytes = MyConverter.StructureToByte<Student>(student1);Student sudent2 = MyConverter.ByteToStructure<Student>(bytes);Console.WriteLine(" After serialization => full name :{0} ID:{1}", sudent2.ID, sudent2.Name);Console.Read();}}public struct Student{public int ID { get; set; }public string Name { get; set; }}
边栏推荐
- Optical blood pressure estimation based on PPG and FFT neural network [translation]
- Oracle advanced (IV) table connection explanation
- Looting iii[post sequence traversal and backtracking + dynamic planning]
- C language daily practice - day 22: Zero foundation learning dynamic planning
- The second day of rhcsa study
- 黑马--Redis篇
- 应用使用Druid连接池经常性断链问题分析
- When visual studio code starts, it prompts "the code installation seems to be corrupt. Please reinstall." Solution to displaying "unsupported" information in the title bar
- AIRIOT物联网平台赋能集装箱行业构建【焊接工位信息监控系统】
- Modulenotfounderror: no module named 'PIL' solution
猜你喜欢

Sanmian ant financial successfully got the offer, and has experience in Android development agency recruitment and interview

保证接口数据安全的10种方案
Interview assault 63: how to remove duplication in MySQL?

How to type multiple spaces when editing CSDN articles
三年Android开发,2022疫情期间八家大厂的Android面试经历和真题整理
![[paper notes] transunet: transformers make strongencoders for medical image segmentation](/img/21/3d4710024248b62495e2681ebd1bc4.png)
[paper notes] transunet: transformers make strongencoders for medical image segmentation

安装Mysql报错:Could not create or access the registry key needed for the...

五金机电行业供应商智慧管理平台解决方案:优化供应链管理,带动企业业绩增长

Meilu biological IPO was terminated: the annual revenue was 385million, and Chen Lin was the actual controller

ROS custom message publishing subscription example
随机推荐
抽象类与抽象方法
黑马--Redis篇
Qlabel marquee text display
An error occurs when installing MySQL: could not create or access the registry key needed for the
多线程基础:线程基本概念与线程的创建
业务与应用同步发展:应用现代化的策略建议
Dark horse -- redis
First day of rhcsa study
渲大师携手向日葵,远控赋能云渲染及GPU算力服务
第五期个人能力认证考核通过名单公布
pytorch常见损失函数
[depth first search] Ji suanke: find numbers
R language uses DT function to generate t-distribution density function data and plot function to visualize t-distribution density function data
In 50W, what have I done right?
Test technology stack arrangement -- self cultivation of test development engineers
tensorflow和torch代码验证cuda是否安装成功
Simple understanding of MySQL database
三面蚂蚁金服成功拿到offer,Android开发社招面试经验
Reptiles have a good time. Are you full? These three bottom lines must not be touched!
Pychrm Community Edition calls matplotlib pyplot. Solution of imshow() function image not popping up