专栏首页逍遥剑客的游戏开发C#脚本实践(四): 反射与序列化

C#脚本实践(四): 反射与序列化

  • 序列化
    • 这个比较简单, .net直接就支持, 以XML序列化为例: public static string SerializeToString (object obj) { XmlSerializer serializer = new XmlSerializer (obj.GetType ()); using (StringWriter writer = new StringWriter()) { serializer.Serialize (writer, obj); return writer.ToString (); } } public static T SerializeFromString<T> (string xml) { XmlSerializer serializer = new XmlSerializer (typeof(T)); using (StringReader reader = new StringReader(xml)) { return (T)serializer.Deserialize (reader); } } public struct Vector3 { public float x; public float y; public float z; } public class TestClass { public int testInt = 1234; public float testFloat = 0.2341f; public bool[] boolArray = {true, false, false, true}; public Vector3 position; public TestClass () { this.position.x = 100; this.position.y = 100; this.position.z = 0; } } 结果如下:<?xml version="1.0" encoding="utf-8"?> <TestClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <testInt>1234</testInt> <testFloat>0.2341</testFloat> <boolArray> <boolean>true</boolean> <boolean>false</boolean> <boolean>false</boolean> <boolean>true</boolean> </boolArray> <position> <x>100</x> <y>100</y> <z>0</z> </position> </TestClass> 到时候把string用mono api传到C++里, 爱怎么存怎么存. 二进制格式同理
  • 反射
    • .net本身也支持反射, 问题是如何反射到C++里
    • 用mono api取得类的meta信息, 然后反应到编辑器上去编辑
    • 如果想偷懒的话, 可以直接用mono创建个窗口, 放个propertygrid控件, 再这个窗口嵌入到主编辑器的界面 int depth = 0; void ListFields(MonoObject* object) { assert(NULL != object); ++depth; MonoClass* objectClass = mono_object_get_class(object); const char* className = mono_class_get_name(objectClass); printf("[%s]\n", className); void* iter = NULL; MonoClassField* field = NULL; while (field = mono_class_get_fields(objectClass, &iter)) { for (int i = 0; i < depth; ++i) { printf("\t"); } const char* fieldName = mono_field_get_name(field); printf("%s : ", fieldName); MonoType* fieldType = mono_field_get_type(field); int type = mono_type_get_type(fieldType); switch (type) { case MONO_TYPE_BOOLEAN: { bool boolValue = false; mono_field_get_value(object, field, &boolValue); printf("%s\n", boolValue ? "true" : "false"); } break; case MONO_TYPE_I4: { int intValue = 0; mono_field_get_value(object, field, &intValue); printf("%d\n", intValue); } break; case MONO_TYPE_R4: { float floatValue = 0; mono_field_get_value(object, field, &floatValue); printf("%f\n", floatValue); } break; case MONO_TYPE_CHAR: case MONO_TYPE_I1: case MONO_TYPE_U1: case MONO_TYPE_I2: case MONO_TYPE_U2: case MONO_TYPE_U4: case MONO_TYPE_I: case MONO_TYPE_U: case MONO_TYPE_I8: case MONO_TYPE_U8: case MONO_TYPE_R8: { //@todo } break; case MONO_TYPE_SZARRAY: { MonoObject* value = mono_field_get_value_object(mono_domain_get(), field, object); MonoArray* array = (MonoArray*)value; uintptr_t size = mono_array_length(array); MonoClass* elementClass = mono_class_get_element_class(mono_object_get_class(value)); MonoType* elementType = mono_class_get_type(elementClass); switch (mono_type_get_type(elementType)) { case MONO_TYPE_BOOLEAN: { bool* data = mono_array_addr(array, bool, 0); for (int i = 0; i < size; ++i) { printf("%s ", data[i] ? "true" : "false"); } printf("\n"); } break; default: //@todo break; } className = mono_class_get_name(elementClass); } break; case MONO_TYPE_STRING: { MonoObject* value = mono_field_get_value_object(mono_domain_get(), field, object); MonoString* valueString = (MonoString*)value; const char* valueCStr = mono_string_to_utf8(valueString); printf("%s\n", valueCStr); } break; default: { MonoObject* value = mono_field_get_value_object(mono_domain_get(), field, object); ListFields(value); } break; } } --depth; } 输出: [TestClass] testBool : false testInt : 1234 testFloat : 0.234100 testString : hello boolArray : true false false true position : [Vector3] x : 100.000000 y : 100.000000 z : 0.000000

C#脚本实践(三): 集成到游戏

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • LINQ初步

    语言集查询(Language Integrated Query, LINQ)集成了C#编程语言中的查询语法,可以用同样的语法访问不同的数据源。LINQ提供了不同...

    TheOneGIS
  • Hibernate入门遇到的一些问题

    使用Configuration config = new Configuration().configure();读取Hibernate的配置文件,文件的默认名...

    TheOneGIS
  • 使用过滤器解决中文乱码问题

    在Web.xml文件中,配置过滤器,其过滤器的URL映射可以使用正则表达式进行配置,如实例中使用“/*”来匹配所有请求。

    TheOneGIS
  • Spark 设置 Hadoop 的配置文件

    当我们在开发Spark应用程序的时候,没有设置Hadoop的配置文件的情况下来读取或者写入HDFS文件,每次都要写上hdfs://host:port/pa...

    ZHANGHAO
  • Log4J使用快速入门

    Log4j由三个重要的组件构成:日志信息的优先级,日志信息的输出目的地,日志信息的输出格式。日志信息的优先级从高到低有ERROR、WARN、 INFO、DEBU...

    TheOneGIS
  • Java SSM框架基础面试题

    作用:Ioc解决对象之间的依赖问题,把所有Bean的依赖关系通过配置文件或注解关联起来,降低了耦合度。

    用户1093975
  • 「小程序JAVA实战」小程序搜索功能(55)

    PS:搜索功能,后台提供url,直接赋值到插件就可以了,通过输入关键字点击搜索,将关键字保存标识传递,关键字传递给index页面,index获取后在根据关键字查...

    IT故事会
  • Dom4j解析带有命名空间的XML文件

        今天我在解析KML文件的过程中,使用XPath表达式,可是返回的结果总是null,纠结了很久,后来通过查资料,发现是我的KML中有命名空间的缘故。

    TheOneGIS
  • Windows下安装Scrapy方法及常见安装问题总结——Scrapy安装教程

    这几天,很多朋友在群里问Scrapy安装的问题,其实问题方面都差不多,今天小编给大家整理一下Scrapy的安装教程,希望日后其他的小伙伴在安装的时候不再...

    Python进阶者
  • Java XML解析工具 dom4j介绍及使用实例

      dom4j的项目地址:http://sourceforge.net/projects/dom4j/?source=directory

    Ryan-Miao

扫码关注云+社区

领取腾讯云代金券