• Marshal的简单使用


    终于从北京回上海了,第一次听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?在CODE上查看代码片派生到我的代码片
     
    1. using System;  
    2. using System.Runtime.InteropServices;  
    3.   
    4. namespace mershal  
    5. {  
    6.     class Model  
    7.     {  
    8.         [Serializable]  
    9.         [StructLayout(LayoutKind.Sequential,Pack = 1)]//按1字节对齐  
    10.         public struct Student  
    11.         {  
    12.             public UInt32 id;  
    13.             [MarshalAsAttribute(UnmanagedType.ByValTStr,SizeConst=20)]  
    14.             public string name;//姓名  
    15.         }  
    16.     }  
    17.   
    18.     class Method  
    19.     {  
    20.         /// <summary>  
    21.         /// 结构体转bytes  
    22.         /// </summary>  
    23.         /// <param name="structObj">结构体</param>  
    24.         /// <param name="decCount">默认0,不截取</param>  
    25.         /// <returns></returns>  
    26.         public static byte[] StructToBytes(object structObj, Int32 decCount)  
    27.         {  
    28.             Int32 size = Marshal.SizeOf(structObj);  
    29.             //开辟空间  
    30.             IntPtr buffer = Marshal.AllocHGlobal(size);  
    31.             try  
    32.             {  
    33.                 Marshal.StructureToPtr(structObj, buffer, false);  
    34.                 byte[] bytes = new byte[size - decCount];  
    35.                 Marshal.Copy(buffer, bytes, 0, size - decCount);  
    36.                 return bytes;  
    37.             }  
    38.             finally  
    39.             {  
    40.                 //释放空间  
    41.                 Marshal.FreeHGlobal(buffer);  
    42.             }  
    43.         }  
    44.         /// <summary>  
    45.         /// byte转结构体  
    46.         /// </summary>  
    47.         /// <param name="bytes">byte数组</param>  
    48.         /// <param name="type">结构体类型</param>  
    49.         /// <returns></returns>  
    50.         public static object ByteToStruct(byte[] bytes, Type type)  
    51.         {  
    52.             Int32 size = Marshal.SizeOf(type);  
    53.             //byte数组长度小于结构体大小  
    54.             if (size > bytes.Length)  
    55.             {  
    56.                 //返回空  
    57.                 return null;  
    58.             }  
    59.             //分配结构大小的内存空间  
    60.             IntPtr structPtr = Marshal.AllocHGlobal(size);  
    61.             //将byte数组拷贝到分配好的内存空间  
    62.             Marshal.Copy(bytes, 0, structPtr, size);  
    63.             //将内存空间转换成目标结构  
    64.             object obj = Marshal.PtrToStructure(structPtr, type);  
    65.             //释放内存空间  
    66.             Marshal.FreeHGlobal(structPtr);  
    67.             //返回结构  
    68.             return obj;  
    69.         }  
    70.     }  
    71. }  


    主函数:

    [csharp] view plaincopyprint?在CODE上查看代码片派生到我的代码片
     
    1. using System;  
    2.   
    3. namespace mershal  
    4. {  
    5.     class Program  
    6.     {  
    7.         static void Main(string[] args)  
    8.         {  
    9.             //实例化  
    10.             Model.Student stu1 = new Model.Student();  
    11.             stu1.id = 1;  
    12.             stu1.name = "丁小未";  
    13.             //打包  
    14.             byte[] byte1 = Method.StructToBytes(stu1,0);  
    15.             Console.WriteLine("字节长度:"+byte1.Length);  
    16.             //解析  
    17.             Model.Student stu =  (Model.Student)Method.ByteToStruct(byte1, typeof(Model.Student));  
    18.             Console.WriteLine(" 输出的学生信息 id:" + stu.id+" name:"+stu.name);  
    19.             Console.Read();  
    20.         }  
    21.     }  
    22. }  


    通信方面可以参考我之前写的,然后结合此文,来做自己的网络游戏!

    点击阅读

    更多教程,欢迎关注我的微博 Http://weibo.com/dingxiaowei2013 !

     
  • 相关阅读:
    微信小程序购物商城系统开发系列-工具篇
    CSS实现导航条Tab切换的三种方法
    最详细win7下手动搭建PHP环境:apache2.4.23+php7.0.11
    读书笔记:《HTML5开发手册》Web表单
    jQuery可拖拽3D万花筒旋转特效
    框架基础:关于ajax设计方案(三)---集成ajax上传技术
    框架基础:ajax设计方案(二)---集成轮询技术
    框架基础:ajax设计方案(一)---集成核心请求
    Apache+PHP+MySQL
    自学 PHP,如何不走弯路?
  • 原文地址:https://www.cnblogs.com/dingxiaowei/p/3670904.html
Copyright © 2020-2023  润新知