打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

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

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

分类: 引擎研究 538人阅读 评论(0) 收藏 举报
  • 序列化
    • 这个比较简单, .net直接就支持, 以XML序列化为例:
      1. public static string SerializeToString (object obj)  
      2. {  
      3.     XmlSerializer serializer = new XmlSerializer (obj.GetType ());  
      4.   
      5.     using (StringWriter writer = new StringWriter()) {  
      6.         serializer.Serialize (writer, obj);  
      7.   
      8.         return writer.ToString ();  
      9.     }  
      10. }  
      11.   
      12. public static T SerializeFromString<T> (string xml)  
      13. {  
      14.     XmlSerializer serializer = new XmlSerializer (typeof(T));  
      15.    
      16.     using (StringReader reader = new StringReader(xml)) {  
      17.         return (T)serializer.Deserialize (reader);  
      18.     }  
      19. }  
      1. public struct Vector3  
      2. {  
      3.     public float x;  
      4.     public float y;  
      5.     public float z;  
      6. }  
      7. public class TestClass  
      8. {  
      9.     public int testInt = 1234;  
      10.     public float testFloat = 0.2341f;  
      11.     public bool[] boolArray = {truefalsefalsetrue};  
      12.     public Vector3 position;  
      13.     public TestClass ()  
      14.     {  
      15.         this.position.x = 100;  
      16.         this.position.y = 100;  
      17.         this.position.z = 0;  
      18.     }  
      19. }  
      结果如下:
      1. <?xml version="1.0" encoding="utf-8"?>  
      2. <TestClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">  
      3.   <testInt>1234</testInt>  
      4.   <testFloat>0.2341</testFloat>  
      5.   <boolArray>  
      6.     <boolean>true</boolean>  
      7.     <boolean>false</boolean>  
      8.     <boolean>false</boolean>  
      9.     <boolean>true</boolean>  
      10.   </boolArray>  
      11.   <position>  
      12.     <x>100</x>  
      13.     <y>100</y>  
      14.     <z>0</z>  
      15.   </position>  
      16. </TestClass>  

      到时候把string用mono api传到C++里, 爱怎么存怎么存. 二进制格式同理
  • 反射
    • .net本身也支持反射, 问题是如何反射到C++里
    • 用mono api取得类的meta信息, 然后反应到编辑器上去编辑
    • 如果想偷懒的话, 可以直接用mono创建个窗口, 放个propertygrid控件, 再这个窗口嵌入到主编辑器的界面
      1. int depth = 0;  
      2. void ListFields(MonoObject* object)  
      3. {  
      4.     assert(NULL != object);  
      5.     ++depth;  
      6.   
      7.     MonoClass* objectClass = mono_object_get_class(object);  
      8.     const char* className = mono_class_get_name(objectClass);  
      9.     printf("[%s]\n", className);  
      10.     void* iter = NULL;  
      11.     MonoClassField* field = NULL;  
      12.     while (field = mono_class_get_fields(objectClass, &iter))  
      13.     {  
      14.         for (int i = 0; i < depth; ++i)  
      15.         {  
      16.             printf("\t");  
      17.         }  
      18.         const char* fieldName = mono_field_get_name(field);  
      19.         printf("%s : ", fieldName);  
      20.         MonoType* fieldType = mono_field_get_type(field);  
      21.         int type = mono_type_get_type(fieldType);  
      22.         switch (type)  
      23.         {  
      24.         case MONO_TYPE_BOOLEAN:  
      25.             {  
      26.                 bool boolValue = false;  
      27.                 mono_field_get_value(object, field, &boolValue);  
      28.                 printf("%s\n", boolValue ? "true" : "false");  
      29.             }  
      30.             break;  
      31.         case MONO_TYPE_I4:  
      32.             {  
      33.                 int intValue = 0;  
      34.                 mono_field_get_value(object, field, &intValue);  
      35.                 printf("%d\n", intValue);  
      36.             }  
      37.             break;  
      38.         case MONO_TYPE_R4:  
      39.             {  
      40.                 float floatValue = 0;  
      41.                 mono_field_get_value(object, field, &floatValue);  
      42.                 printf("%f\n", floatValue);  
      43.             }  
      44.             break;  
      45.         case MONO_TYPE_CHAR:  
      46.         case MONO_TYPE_I1:  
      47.         case MONO_TYPE_U1:  
      48.         case MONO_TYPE_I2:  
      49.         case MONO_TYPE_U2:  
      50.         case MONO_TYPE_U4:  
      51.         case MONO_TYPE_I:  
      52.         case MONO_TYPE_U:  
      53.         case MONO_TYPE_I8:  
      54.         case MONO_TYPE_U8:  
      55.         case MONO_TYPE_R8:  
      56.             {  
      57.                 //@todo  
      58.             }  
      59.             break;  
      60.         case MONO_TYPE_SZARRAY:  
      61.             {  
      62.                 MonoObject* value = mono_field_get_value_object(mono_domain_get(), field, object);  
      63.                 MonoArray* array = (MonoArray*)value;  
      64.                 uintptr_t size = mono_array_length(array);  
      65.                 MonoClass* elementClass = mono_class_get_element_class(mono_object_get_class(value));  
      66.                 MonoType* elementType = mono_class_get_type(elementClass);  
      67.                 switch (mono_type_get_type(elementType))  
      68.                 {  
      69.                 case MONO_TYPE_BOOLEAN:  
      70.                     {  
      71.                         bool* data = mono_array_addr(array, bool, 0);  
      72.                         for (int i = 0; i < size; ++i)  
      73.                         {  
      74.                             printf("%s ", data[i] ? "true" : "false");  
      75.                         }  
      76.                         printf("\n");  
      77.                     }  
      78.                     break;  
      79.                 default//@todo  
      80.                     break;  
      81.                 }  
      82.                 className = mono_class_get_name(elementClass);  
      83.             }  
      84.             break;  
      85.         case MONO_TYPE_STRING:  
      86.             {  
      87.                 MonoObject* value = mono_field_get_value_object(mono_domain_get(), field, object);  
      88.                 MonoString* valueString = (MonoString*)value;  
      89.                 const char* valueCStr = mono_string_to_utf8(valueString);  
      90.                 printf("%s\n", valueCStr);  
      91.             }  
      92.             break;  
      93.         default:  
      94.             {  
      95.                 MonoObject* value = mono_field_get_value_object(mono_domain_get(), field, object);  
      96.                 ListFields(value);  
      97.             }  
      98.             break;  
      99.         }  
      100.     }  
      101.     --depth;  
      102. }  
      输出:
      1. [TestClass]  
      2.         testBool : false  
      3.         testInt : 1234  
      4.         testFloat : 0.234100  
      5.         testString : hello  
      6.         boolArray : true false false true  
      7.         position : [Vector3]  
      8.                 x : 100.000000  
      9.                 y : 100.000000  
      10.                 z : 0.000000  


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

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
ANDROID轻量级JSON序列化和反序列化
JSON的序列化和反序列化
序列化反序列化 (binary/xml)
【C++ 序列化:从设计到实现】
TreeView序列化,TreeView串行化,TreeView反序列化 c# winfo...
网络,以人为本! 谈谈J2SE中的序列化之接受默认序列化1
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服