终于从北京回上海了,第一次听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类:

  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. public struct Student
  10. {
  11. public UInt32 id;
  12. [MarshalAsAttribute(UnmanagedType.ByValTStr,SizeConst=20)]
  13. public string 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. public static byte[] 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 = new byte[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. public static object ByteToStruct(byte[] bytes, Type type)
  49. {
  50. Int32 size = Marshal.SizeOf(type);
  51. //byte数组长度小于结构体大小
  52. if (size > bytes.Length)
  53. {
  54. //返回空
  55. return null;
  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. }

主函数:

  1. using System;
  2. namespace mershal
  3. {
  4. class Program
  5. {
  6. static void 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. }

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

点击阅读

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

 

Marshal的简单使用的更多相关文章

  1. CSharpGL(23)用ComputeShader实现一个简单的ParticleSimulator

    CSharpGL(23)用ComputeShader实现一个简单的ParticleSimulator 我还没有用过Compute Shader,所以现在把红宝书里的例子拿来了,加入CSharpGL中. ...

  2. 用最简单的方式在C#中使用多线程加速耗时的图像处理算法的执行(多核机器)。

    图像处理中,有很多算法由于其内在的复杂性是天然的耗时大户,加之图像本身蕴涵的数据量比一般的对象就大,因此,针对这类算法,执行速度的提在很大程度上依赖于硬件的性能,现在流行的CPU都是至少2核的,稍微好 ...

  3. c# 进程间的通信实现之一简单字符串收发

       使用Windows API实现两个进程间(含窗体)的通信在Windows下的两个进程之间通信通常有多种实现方式,在.NET中,有如命名管道.消息队列.共享内存等实现方式,这篇文章要讲的是使用Wi ...

  4. golang json 包简单分析

    首先上代码: func main() { b := true a1, _ := json.Marshal(b) a2, _ := Marshal(b) fmt.Println(string(a1)) ...

  5. 一个简单的CORBA例子

    因为对CORBA分析的需要,这里写一个简单的CORBA例子.从JDK1.2开始,JDK中集成了ORB的实现,本例子使用了JDK1.7,对于JDK1.2+应该都没有问题.这个例子实现一个简单的加减乘除的 ...

  6. 使用Go开发一个简单的服务器程序

    最近有个小项目,需要一个简单的后台程序来支撑,本来想用Nodejs来做,但是由于本人js一直很菜,并且很讨厌callback,虽然我也很喜欢异步模型,但我一直都觉得JS是反人类的.后台就用了go处理, ...

  7. VSPackge插件系列:简单文本编辑器的实现

    相比其它开发环境,VS的好用就不用多说了,尽管VS很人性化,但是针对具体的我们想实现的功能时,会力不从心,也许会有很多现成的插件,但是作为一名程序员,我还是喜欢自己去写一些东西,因为这样能随心所欲的想 ...

  8. maven 简单实用教程

    1. Maven介绍 1.1. 简介 java编写的用于构建系统的自动化工具. 目前版本是2.0.9,注意maven2和maven1有很大区别,阅读第三方文档时需要区分版本. 1.2. Maven资源 ...

  9. Marshal 类的内存操作的一般功能

    Marshal类 提供了一个方法集,这些方法用于分配非托管内存.复制非托管内存块.将托管类型转换为非托管类型,此外还提供了在与非托管代码交互时使用的其他杂项方法. 命名空间:System.Runtim ...

随机推荐

  1. 解决:IOError: [Errno 28] No space left on device(设备空间不足)

    问题重现: 问题分析: 出现这样的问题,是磁盘空间不足,需要清理.卸载一下系统非必要软件和文件. 解决方案: 可以使用如下命令清理: #自动清理残余的依赖库 sudo apt-get autoremo ...

  2. Java基础-一个java文件多个类的问题

    一个.java文件当然可以包括多个类.但这些类有一个特殊的类与其它的不同,,这个类是带public 属性的类.一个.java类文件中仅有一个public属性的类.而且这个类与文件名相同.

  3. git版本控制?

    git是一个分布式的版本控制系统,版本控制系统,类似于保险箱,而我们的代码就是资产:通过对代码的有效管理可以更好的提高我们的生产效率:maven是主要是一个项目构建工具,解决的是我们个人在开发过程中的 ...

  4. Perplexity Vs Cross-entropy

    Evaluating a Language Model: Perplexity We have a serial of \(m\) sentences: \[s_1,s_2,\cdots,s_m\] ...

  5. <<< struts 的一系列介绍

    struts有什么用? 以前使用servlet开发应用系统的人深深感受到在java代码中嵌入大量html代码是一件非常痛苦的事,于是sun推出了JSP,解决了java代码中嵌入html代码的问题.但是 ...

  6. 9月11日上午HTML有序列表、无序列表、网页的格式和布局

    样式表 六.列表方块 1.有序列表变无序列表 <ol> <li>张店</li> <li>桓台</li> <li>淄川</l ...

  7. 解决ArcGIS安装之后出现的Windows installer configures问题

    ----Please wait while Windows installer configures ArcGIS Desktop Error Message错误信息 When launching A ...

  8. 获取centos6.5系统信息脚本

    最近想尝试做两件比较重要的事情,第一是用python写个cmdb,第二还是用python写个小型监控系统,下面是获取系统信息的脚本: #!/usr/bin/env python # coding:ut ...

  9. CSS高效开发实战:CSS 3、LESS、SASS、Bootstrap、Foundation --读书笔记(2)CSS3利用图层叠加实现多背景

    CSS 3允许设置多个背景图片,每个背景图片占一层,层的上下按照在CSS中书写的顺序来定,最先写的背景在最上层,每层图片定义使用英文逗号隔开. 例如下面的代码: background:url(http ...

  10. 微信公众平台可通过UnionID机制在多公众号间帐号互通

    微信公众平台越来越注重开发者的反馈信息了,这不,微信开放平台提供了UnionID机制,通过获取用户基本信息接口,开发者可通过OpenID来获取用户基本信息,而如果开发者拥有多个公众号,可使用以下办法通 ...