Marshal类的简单使用
2019獨角獸企業重金招聘Python工程師標準>>>
終于從北京回上海了,第一次聽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的機器是小端模式。
效果圖
代碼
Model類:
[csharp]?view plaincopyprint?
using?System;??
using?System.Runtime.InteropServices;??
??
namespace?mershal??
{??
????class?Model??
????{??
????????[Serializable]??
????????[StructLayout(LayoutKind.Sequential,Pack?=?1)]//按1字節對齊??
????????public?struct?Student??
????????{??
????????????public?UInt32?id;??
????????????[MarshalAsAttribute(UnmanagedType.ByValTStr,SizeConst=20)]??
????????????public?string?name;//姓名??
????????}??
????}??
??
????class?Method??
????{??
????????///?<summary>??
????????///?結構體轉bytes??
????????///?</summary>??
????????///?<param?name="structObj">結構體</param>??
????????///?<param?name="decCount">默認0,不截取</param>??
????????///?<returns></returns>??
????????public?static?byte[]?StructToBytes(object?structObj,?Int32?decCount)??
????????{??
????????????Int32?size?=?Marshal.SizeOf(structObj);??
????????????//開辟空間??
????????????IntPtr?buffer?=?Marshal.AllocHGlobal(size);??
????????????try??
????????????{??
????????????????Marshal.StructureToPtr(structObj,?buffer,?false);??
????????????????byte[]?bytes?=?new?byte[size?-?decCount];??
????????????????Marshal.Copy(buffer,?bytes,?0,?size?-?decCount);??
????????????????return?bytes;??
????????????}??
????????????finally??
????????????{??
????????????????//釋放空間??
????????????????Marshal.FreeHGlobal(buffer);??
????????????}??
????????}??
????????///?<summary>??
????????///?byte轉結構體??
????????///?</summary>??
????????///?<param?name="bytes">byte數組</param>??
????????///?<param?name="type">結構體類型</param>??
????????///?<returns></returns>??
????????public?static?object?ByteToStruct(byte[]?bytes,?Type?type)??
????????{??
????????????Int32?size?=?Marshal.SizeOf(type);??
????????????//byte數組長度小于結構體大小??
????????????if?(size?>?bytes.Length)??
????????????{??
????????????????//返回空??
????????????????return?null;??
????????????}??
????????????//分配結構大小的內存空間??
????????????IntPtr?structPtr?=?Marshal.AllocHGlobal(size);??
????????????//將byte數組拷貝到分配好的內存空間??
????????????Marshal.Copy(bytes,?0,?structPtr,?size);??
????????????//將內存空間轉換成目標結構??
????????????object?obj?=?Marshal.PtrToStructure(structPtr,?type);??
????????????//釋放內存空間??
????????????Marshal.FreeHGlobal(structPtr);??
????????????//返回結構??
????????????return?obj;??
????????}??
????}??
}??
主函數:
[csharp]?view plaincopyprint?
using?System;??
??
namespace?mershal??
{??
????class?Program??
????{??
????????static?void?Main(string[]?args)??
????????{??
????????????//實例化??
????????????Model.Student?stu1?=?new?Model.Student();??
????????????stu1.id?=?1;??
????????????stu1.name?=?"丁小未";??
????????????//打包??
????????????byte[]?byte1?=?Method.StructToBytes(stu1,0);??
????????????Console.WriteLine("字節長度:"+byte1.Length);??
????????????//解析??
????????????Model.Student?stu?=??(Model.Student)Method.ByteToStruct(byte1,?typeof(Model.Student));??
????????????Console.WriteLine("\n輸出的學生信息\nid:"?+?stu.id+"\nname:"+stu.name);??
????????????Console.Read();??
????????}??
????}??
}??
通信方面可以參考我之前寫的,然后結合此文,來做自己的網絡游戲!
點擊閱讀
更多教程,歡迎關注我的微博?!
轉載于:https://my.oschina.net/dingxiaowei/blog/223463
總結
以上是生活随笔為你收集整理的Marshal类的简单使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MyEclipse中导入java文件出现
- 下一篇: POJ 3461 kmp 应用