日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

C#-利用Marshal类实现序列化

發布時間:2023/12/18 C# 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C#-利用Marshal类实现序列化 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

主要是使用Marshal類里的兩個方法:

第一個是StructureToPtr,將數據從托管對象封送到非托管內存塊。

第二個是PtrToStructure,將數據從非托管內存塊封送到新分配的指定類型的托管對象。

只要有了這兩個相互轉換的方法,我們就可以實現序列化了。

首先我們先來看下序列化

序列化:
有一個前提條件,那就是我們必須要知道需要序列化對象的大小。

第一步:我們先求出對象的大小,然后在非托管內存中給它分配相應的內存大小。

第二步:接著我們就把這個對象封送到剛分配出來的內存中,之后我們會得到一個分配出來的內存塊首地址指針。

第三步:最后我們可以通過這個首地址指針,從指針所指的位置處開始,拷貝數據到指定的byte[]數組中,拷貝的長度就是我們為這個對象分配出來的內存大小,得到byte[]數據后,下面的事情我就不用多說了,你可以保存到數據庫或者文件中。

反序列化:
序列化的時候我們先將一個對象封送到了非托管內存塊中,然后再把內存塊中的數據讀到byte[]數組中,

現在我們反序列化

第一步:我們先求出對象的大小,然后在非托管內存中給它分配相應的內存大小。

第二步:然后把這個byte[]數據拷貝到非托管內存塊中。

第三步:最后再從內存塊中封送指定大小的數據到對象中。

有一個地方需要注意,那就是因為引用類型的對象我們是無法求的它的實際大小的,所以這里的對象我們只能使用非托管對象,比如struct結構體。

所以,當我們只是用來存儲數據,不涉及任何操作的對象,我們可以把它作為一個結構體來處理,這樣我們在序列化的時候可以節省空間開銷。

因為你如果你要是用平常的序列化方法去序列化一個類對象,他所需要的空間開銷是要大于你去序列化一個具有相同結構的struct對象。

下面是代碼:?

  • public static class MyConverter

  • {

  • /// <summary>

  • /// 由結構體轉換為byte數組

  • /// </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>

  • /// 由byte數組轉換為結構體

  • /// </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;

  • }

  • }

  • //測試代碼///

  • class Program

  • {

  • static void Main(string[] args)

  • {

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

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

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

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

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

  • Console.Read();

  • }

  • }

  • public struct Student

  • {

  • public int ID { get; set; }

  • public string Name { get; set; }

  • }

  • 總結

    以上是生活随笔為你收集整理的C#-利用Marshal类实现序列化的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。