[.NET2.0]Marshal类的使用

简介: 终于从北京回上海了,第一次听unity开发者大会,感觉讲的都是一些Unity 5新功能的介绍,其实主要还是要靠自己去摸索那些新的功能,主要就是添加了新的GUI系统,貌似集成了NGUI到Unity中,取名UGUI,还有就是集成了新的声音系统和新的动画系统,我感觉新的声音系统还是比较强大的,期待unity5的问世。

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

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;
        }
    }
}

主函数:

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

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

点击阅读

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

相关文章
|
7月前
|
IDE API 开发工具
拦截|篡改|伪造.NET类库中不限于public的类和方法
本文除了回顾拦截.NET类库中的方法,实现方法参数的篡改、方法返回结果的伪造,再着重介绍.NET类库中非public类及方法如何拦截。
拦截|篡改|伪造.NET类库中不限于public的类和方法
|
10月前
|
C#
.NET Core反射获取带有自定义特性的类,通过依赖注入根据Attribute元数据信息调用对应的方法
.NET Core反射获取带有自定义特性的类,通过依赖注入根据Attribute元数据信息调用对应的方法
122 0
|
开发框架 JSON 前端开发
【C#】.net core2.1,自定义全局类对API接口和视图页面产生的异常统一处理
在开发一个网站项目时,异常处理和过滤功能是最基础的模块 本篇文章就来讲讲,如何自定义全局异常类来统一处理
204 0
|
JSON 数据格式
【.NET开发福音】使用Visual Studio将JSON格式数据自动转化为对应的类
【.NET开发福音】使用Visual Studio将JSON格式数据自动转化为对应的类
533 0
【.NET开发福音】使用Visual Studio将JSON格式数据自动转化为对应的类
|
缓存 移动开发 C#
【.Net实用方法总结】 整理并总结System.IO中TextWriter类及其方法介绍
本文主要介绍System.IO命名空间的TextWriter类,介绍其常用的方法和示例说明。
|
C# 开发者 索引
【.Net实用方法总结】 整理并总结System.IO中TextReader类及其方法介绍
本文主要介绍System.IO命名空间的TextReader类,介绍其常用的方法和示例说明。
|
存储 缓存 C#
【.Net实用方法总结】 整理并总结System.IO中StringWriter类及其方法介绍
本文主要介绍System.IO命名空间的StringWriter类,介绍其常用的方法和示例说明。
|
C# 开发者 索引
【.Net实用方法总结】 整理并总结System.IO中StringReader类及其方法介绍
本文主要介绍System.IO命名空间的StringReader类,介绍其常用的方法和示例说明。
|
存储 网络协议 程序员
【.Net实用方法总结】 整理并总结System.IO中Stream类及其方法介绍
本文主要介绍System.IO命名空间的Stream类,介绍其常用的方法和示例说明。
|
缓存 C# 开发者
【.Net实用方法总结】 整理并总结System.IO中StreamWriter类及其方法介绍
本文主要介绍System.IO命名空间的StreamWriter类,介绍其常用的方法和示例说明。