广州双城热恋创意文化传播有限公司

现在的位置: 主页 > 企业简介 > 文章列表

文章正文

[.NET2.0]Marshal类的使用

作者:广州双城热恋创意文化传播有限公司 来源:www.666loveyou.com 发布时间:2017-09-11 14:14:03
[.NET2.0]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]

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]

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();

}

}

}

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

企业建站2800元起,携手武汉肥猫科技,做一个有见地的颜值派!更多优惠请戳:天门网站制作 http://tianmen.666rj.com


COPYRIGHT © 2015 广州双城热恋创意文化传播有限公司 ALL RIGHTS RESERVED.
网站地图 技术支持:肥猫科技
精彩专题:网站建设
购买本站友情链接、项目合作请联系客服QQ:2500-38-100