当前位置:网站首页>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; }
}
边栏推荐
- Computer network: sorting out common network interview questions (I)
- R语言使用order函数对dataframe数据进行排序、基于单个字段(变量)进行降序排序(DESCENDING)
- QPushButton绑定快捷键的注意事项
- helm部署etcd集群
- Tongyu Xincai rushes to Shenzhen Stock Exchange: the annual revenue is 947million Zhang Chi and Su Shiguo are the actual controllers
- R language uses the order function to sort the dataframe data, and descending sorting based on a single field (variable)
- 【pytorch】yolov5 训练自己的数据集
- openmv4 学习笔记1----一键下载、图像处理背景知识、LAB亮度-对比度
- Multithreading Basics: basic concepts of threads and creation of threads
- 业务与应用同步发展:应用现代化的策略建议
猜你喜欢
Reptiles have a good time. Are you full? These three bottom lines must not be touched!
Yutai micro rushes to the scientific innovation board: Huawei and Xiaomi fund are shareholders to raise 1.3 billion
Estimate blood pressure according to PPG using spectral spectrum time depth neural network [turn]
Computer network: sorting out common network interview questions (I)
安装Mysql报错:Could not create or access the registry key needed for the...
Airiot IOT platform enables the container industry to build [welding station information monitoring system]
Mathematical knowledge -- code implementation of Gaussian elimination (elementary line transformation to solve equations)
Visual Studio Code启动时提示“Code安装似乎损坏。请重新安装。”、标题栏显示“不受支持”信息的解决办法
包装行业商业供应链管理平台解决方案:布局智慧供应体系,数字化整合包装行业供应链
Implementation of AVL tree
随机推荐
反射及在运用过程中出现的IllegalAccessException异常
第五期个人能力认证考核通过名单公布
Pychrm Community Edition calls matplotlib pyplot. Solution of imshow() function image not popping up
Php+redis realizes the function of canceling orders over time
Some recruitment markets in Shanghai refuse to recruit patients with covid-19 positive
黑马--Redis篇
Optical blood pressure estimation based on PPG and FFT neural network [translation]
Looting iii[post sequence traversal and backtracking + dynamic planning]
ROS自定义消息发布订阅示例
Pytorch common loss function
About static type, dynamic type, ID, instancetype
Video based full link Intelligent Cloud? This article explains in detail what Alibaba cloud video cloud "intelligent media production" is
Dark horse -- redis
Estimate blood pressure according to PPG using spectral spectrum time depth neural network [turn]
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
An error occurs when installing MySQL: could not create or access the registry key needed for the
How to improve website weight
Black Horse - - Redis Chapter
R language ggplot2 visualization: use the ggstripchart function of ggpubr package to visualize the grouped dot strip plot, and set the add parameter to add box plots for different levels of dot strip
Based on butterfly species recognition