当前位置:网站首页>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; }
}
边栏推荐
- Use of deg2rad and rad2deg functions in MATLAB
- 基于蝴蝶种类识别
- 【论文笔记】TransUNet: Transformers Make StrongEncoders for Medical Image Segmentation
- LeetCode-1279. 红绿灯路口
- How word displays modification traces
- Help improve the professional quality of safety talents | the first stage of personal ability certification and assessment has been successfully completed!
- Human bone point detection: top-down (part of the theory)
- 五金机电行业智能供应链管理系统解决方案:数智化供应链为传统产业“造新血”
- Tensorflow and torch code verify whether CUDA is successfully installed
- 五金机电行业供应商智慧管理平台解决方案:优化供应链管理,带动企业业绩增长
猜你喜欢
Wx applet learning notes day01
openmv4 学习笔记1----一键下载、图像处理背景知识、LAB亮度-对比度
反射及在运用过程中出现的IllegalAccessException异常
Multithreading Basics: basic concepts of threads and creation of threads
C language daily practice - day 22: Zero foundation learning dynamic planning
Dark horse -- redis
Digital "new" operation and maintenance of energy industry
How are you in the first half of the year occupied by the epidemic| Mid 2022 summary
About static type, dynamic type, ID, instancetype
MRO industrial products enterprise procurement system: how to refine procurement collaborative management? Industrial products enterprises that want to upgrade must see!
随机推荐
First day of rhcsa study
PMP practice once a day | don't get lost in the exam -7.6
Help improve the professional quality of safety talents | the first stage of personal ability certification and assessment has been successfully completed!
Qlabel marquee text display
Solution of intelligent management platform for suppliers in hardware and electromechanical industry: optimize supply chain management and drive enterprise performance growth
Sanmian ant financial successfully got the offer, and has experience in Android development agency recruitment and interview
Use of deg2rad and rad2deg functions in MATLAB
史上超级详细,想找工作的你还不看这份资料就晚了
Yutai micro rushes to the scientific innovation board: Huawei and Xiaomi fund are shareholders to raise 1.3 billion
test about BinaryTree
R语言使用rchisq函数生成符合卡方分布的随机数、使用plot函数可视化符合卡方分布的随机数(Chi Square Distribution)
Binary search tree
Three years of Android development, Android interview experience and real questions sorting of eight major manufacturers during the 2022 epidemic
Helm deploy etcd cluster
tensorflow和torch代码验证cuda是否安装成功
业务与应用同步发展:应用现代化的策略建议
R语言ggplot2可视化:使用ggpubr包的ggstripchart函数可视化分组点状条带图(dot strip plot)、设置add参数为不同水平点状条带图添加箱图
Mathematical knowledge -- code implementation of Gaussian elimination (elementary line transformation to solve equations)
MRO工业品企业采购系统:如何精细化采购协同管理?想要升级的工业品企业必看!
R语言dplyr包进行数据分组聚合统计变换(Aggregating transforms)、计算dataframe数据的分组均值(mean)