亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Marshal類的簡單介紹

發布時間:2020-07-12 03:06:21 來源:網絡 閱讀:7422 作者:蓬萊仙羽 欄目:編程語言

終于從北京回上海了,第一次聽unity開發者大會,感覺講的都是一些Unity 5新功能的介紹,其實主要還是要靠自己去摸索那些新的功能,主要就是添加了新的GUI系統,貌似集成了NGUI到Unity中,取名UGUI,還有就是集成了新的聲音系統和新的動畫系統,我感覺新的聲音系統還是比較強大的,期待unity5的問世。大會上介紹了一些常用的插件以及Test Tools的使用,總體而言都是一些展望未來性質多點哈。希望Unity越來越強大!

廢話不多說,接下來介紹一下客戶端服務器通訊常用的一種方法——Marshal類,這個類是.NETFramework2.0中的類,所以我們能夠將其用于Unity中。與這個類類似的還有litjson等,可能是為了節省字節空間,Marshal類只僅僅將值進行打包成bytes流,而json還包含前面的key值。當然你也可以選擇json的方式,我這里僅僅介紹Marshal類的使用。點擊進入MSDN中Marshal類的介紹和使用

在這之前首先要了解一下關于字節序的大端和小端模式,點擊閱讀,可以參考這篇文章了解一下。這里我用的window的機器是小端模式。

效果圖

Marshal類的簡單介紹

Marshal類的簡單介紹

代碼

Model類:


[csharp]view plaincopyprint?Marshal類的簡單介紹Marshal類的簡單介紹
  1. using System;  

  2. using System.Runtime.InteropServices;  

  3. namespace mershal  

  4. {  

  5. class Model  

  6.    {  

  7.        [Serializable]  

  8.        [StructLayout(LayoutKind.Sequential,Pack = 1)]//按1字節對齊

  9. publicstruct Student  

  10.        {  

  11. public UInt32 id;  

  12.            [MarshalAsAttribute(UnmanagedType.ByValTStr,SizeConst=20)]  

  13. publicstring name;//姓名

  14.        }  

  15.    }  

  16. class Method  

  17.    {  

  18. /// <summary>

  19. /// 結構體轉bytes

  20. /// </summary>

  21. /// <param name="structObj">結構體</param>

  22. /// <param name="decCount">默認0,不截取</param>

  23. /// <returns></returns>

  24. publicstaticbyte[] StructToBytes(object structObj, Int32 decCount)  

  25.        {  

  26.            Int32 size = Marshal.SizeOf(structObj);  

  27. //開辟空間

  28.            IntPtr buffer = Marshal.AllocHGlobal(size);  

  29. try

  30.            {  

  31.                Marshal.StructureToPtr(structObj, buffer, false);  

  32. byte[] bytes = newbyte[size - decCount];  

  33.                Marshal.Copy(buffer, bytes, 0, size - decCount);  

  34. return bytes;  

  35.            }  

  36. finally

  37.            {  

  38. //釋放空間

  39.                Marshal.FreeHGlobal(buffer);  

  40.            }  

  41.        }  

  42. /// <summary>

  43. /// byte轉結構體

  44. /// </summary>

  45. /// <param name="bytes">byte數組</param>

  46. /// <param name="type">結構體類型</param>

  47. /// <returns></returns>

  48. publicstaticobject ByteToStruct(byte[] bytes, Type type)  

  49.        {  

  50.            Int32 size = Marshal.SizeOf(type);  

  51. //byte數組長度小于結構體大小

  52. if (size > bytes.Length)  

  53.            {  

  54. //返回空

  55. returnnull;  

  56.            }  

  57. //分配結構大小的內存空間

  58.            IntPtr structPtr = Marshal.AllocHGlobal(size);  

  59. //將byte數組拷貝到分配好的內存空間

  60.            Marshal.Copy(bytes, 0, structPtr, size);  

  61. //將內存空間轉換成目標結構

  62. object obj = Marshal.PtrToStructure(structPtr, type);  

  63. //釋放內存空間

  64.            Marshal.FreeHGlobal(structPtr);  

  65. //返回結構

  66. return obj;  

  67.        }  

  68.    }  

  69. }  


主函數:

[csharp]view plaincopyprint?Marshal類的簡單介紹Marshal類的簡單介紹
  1. using System;  

  2. namespace mershal  

  3. {  

  4. class Program  

  5.    {  

  6. staticvoid Main(string[] args)  

  7.        {  

  8. //實例化

  9.            Model.Student stu1 = new Model.Student();  

  10.            stu1.id = 1;  

  11.            stu1.name = "丁小未";  

  12. //打包

  13. byte[] byte1 = Method.StructToBytes(stu1,0);  

  14.            Console.WriteLine("字節長度:"+byte1.Length);  

  15. //解析

  16.            Model.Student stu =  (Model.Student)Method.ByteToStruct(byte1, typeof(Model.Student));  

  17.            Console.WriteLine("\n輸出的學生信息\nid:" + stu.id+"\nname:"+stu.name);  

  18.            Console.Read();  

  19.        }  

  20.    }  

  21. }  


通信方面可以參考我之前寫的,然后結合此文,來做自己的網絡游戲!

socket通訊

更多教程,歡迎關注我的微博 !


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

元江| 长泰县| 越西县| 靖边县| 应用必备| 蒙自县| 波密县| 库尔勒市| 永登县| 虹口区| 海伦市| 托克托县| 刚察县| 砚山县| 金湖县| 东乡族自治县| 罗江县| 高邮市| 亚东县| 乐昌市| 河北区| 尉氏县| 祥云县| 密云县| 云和县| 普宁市| 富蕴县| 鲜城| 凤城市| 吉林市| 正阳县| 凤凰县| 常德市| 昌都县| 札达县| 米脂县| 张家界市| 东兰县| 南昌县| 图们市| 松江区|