当前位置:网站首页>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; }}
边栏推荐
- Countdown 2 days | live broadcast preview of Tencent cloud message queue data import platform
- Oracle advanced (IV) table connection explanation
- Use map function and split function to type multiple elements in one line
- R语言ggplot2可视化:使用ggpubr包的ggdotplot函数可视化点阵图(dot plot)、设置palette参数设置不同水平点阵图数据点和箱图的颜色
- 包装行业商业供应链管理平台解决方案:布局智慧供应体系,数字化整合包装行业供应链
- 黑馬--Redis篇
- Yutai micro rushes to the scientific innovation board: Huawei and Xiaomi fund are shareholders to raise 1.3 billion
- 受益匪浅,安卓面试问题
- English topic assignment (25)
- AcWing 3537. Tree lookup complete binary tree
猜你喜欢

AutoCAD - what is the default lineweight for centerline drawing and CAD? Can I modify it?

PMP每日一练 | 考试不迷路-7.6

Tongyu Xincai rushes to Shenzhen Stock Exchange: the annual revenue is 947million Zhang Chi and Su Shiguo are the actual controllers

Php+redis realizes the function of canceling orders over time

Interface test tool - postman

The second day of rhcsa study
Three years of Android development, Android interview experience and real questions sorting of eight major manufacturers during the 2022 epidemic
![[paper notes] transunet: transformers make strongencoders for medical image segmentation](/img/21/3d4710024248b62495e2681ebd1bc4.png)
[paper notes] transunet: transformers make strongencoders for medical image segmentation

Actf 2022 came to a successful conclusion, and 0ops team won the second consecutive championship!!

黑馬--Redis篇
随机推荐
Word如何显示修改痕迹
Solution of commercial supply chain management platform for packaging industry: layout smart supply system and digitally integrate the supply chain of packaging industry
English topic assignment (25)
Video based full link Intelligent Cloud? This article explains in detail what Alibaba cloud video cloud "intelligent media production" is
Intelligent supply chain management system solution for hardware and electromechanical industry: digital intelligent supply chain "creates new blood" for traditional industries
Tensorflow and torch code verify whether CUDA is successfully installed
Lucun smart sprint technology innovation board: annual revenue of 400million, proposed to raise 700million
Optical blood pressure estimation based on PPG and FFT neural network [translation]
First day of rhcsa study
Druid 数据库连接池 详解
A method of removing text blur based on pixel repair
Understanding disentangling in β- VAE paper reading notes
AUTOCAD——中心线绘制、CAD默认线宽是多少?可以修改吗?
short i =1; i=i+1与short i=1; i+=1的区别
应用使用Druid连接池经常性断链问题分析
Digital "new" operation and maintenance of energy industry
黑马--Redis篇
使用map函数、split函数一行键入多个元素
R language uses rchisq function to generate random numbers that conform to Chi square distribution, and uses plot function to visualize random numbers that conform to Chi square distribution
C language daily practice - day 22: Zero foundation learning dynamic planning