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的机器是小端模式。

效果图

Center

Center

代码

Model类:


[csharp] view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  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 plain copy print ? 在CODE上查看代码片 派生到我的代码片
  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通讯

更多教程,欢迎关注我的微博 !




















本文转蓬莱仙羽 51CTO博客,原文链接:http://blog.51cto.com/dingxiaowei/1397266,如需转载请自行联系原作者

相关文章
|
算法 前端开发 数据可视化
数据结构与算法在前端开发中的实际应用
本文将探讨数据结构与算法在前端开发中的实际应用,重点介绍在处理大规模数据、优化性能和提升用户体验方面的具体场景和解决方案。
298 15
|
C# 开发者
深入理解C#中的`Task<T>`:异步编程的核心
【1月更文挑战第3天】本文旨在探讨C#中`Task<T>`的使用和理解,作为异步编程模式的核心组件。`Task<T>`允许开发者在不阻塞主线程的情况下执行异步操作,并返回一个指定类型`T`的结果。通过定义返回`Task<T>`的异步方法、使用`async`和`await`关键字、处理异常以及获取任务结果,开发者可以编写出高效且响应迅速的应用程序。此外,本文还介绍了如何配置任务以及实现任务的连续性和组合,为掌握C#中的异步编程提供了全面的指导。
|
7月前
|
Ubuntu Java Linux
Linux 安装 Qualcomm ® SnapdragonTM Profiler
通过本文的详细介绍,您应该已经成功在 Linux 系统上安装并配置了 Qualcomm® Snapdragon™ Profiler,并能够连接 Android 设备进行性能分析。Snapdragon Profiler 提供了丰富的工具和功能,可以帮助开发者深入了解应用程序的性能瓶颈,从而进行优化。希望本文能对您有所帮助,让您在开发过程中更高效地使用 Snapdragon Profiler 进行性能分析和优化。
361 10
|
12月前
|
前端开发 JavaScript
React_函数式Hooks和Class比较优缺点
React Hooks与Class组件都能返回JSX并接收props,但Hooks无`this`指向问题,用`useEffect`模拟生命周期,`memo`优化性能,状态更新用`useState`;Class组件通过生命周期方法、`PureComponent`或`shouldComponentUpdate`优化,状态用`this.state`和`this.setState`管理。
157 1
React_函数式Hooks和Class比较优缺点
|
负载均衡 中间件 应用服务中间件
中间件负载均衡
【7月更文挑战第21天】
599 6
|
开发框架 .NET 编译器
总结一下 C# 如何自定义特性 Attribute 并进行应用
总结一下 C# 如何自定义特性 Attribute 并进行应用
317 1
|
开发框架 缓存 NoSQL
基于SqlSugar的数据库访问处理的封装,在.net6框架的Web API上开发应用
基于SqlSugar的数据库访问处理的封装,在.net6框架的Web API上开发应用
|
前端开发 开发者
react class与hooks区别
react class与hooks区别
270 0
|
缓存 图形学 异构计算
【#Unity Shader#Amplify Shader Editor(ASE)_第二篇】
【#Unity Shader#Amplify Shader Editor(ASE)_第二篇】
|
C# Windows
c#学习系列相关之多线程(三)----invoke和begininvoke
c#学习系列相关之多线程(三)----invoke和begininvoke
1691 0

热门文章

最新文章