打开APP
未登录
开通VIP,畅享免费电子书等14项超值服
开通VIP
首页
好书
留言交流
下载APP
联系客服
C#脚本实践(四): 反射与序列化
quasiceo
>《计算机》
2012.12.17
关注
C#脚本实践(四): 反射与序列化
分类:
引擎研究
2011-11-26 17:18
538人阅读
评论
(0)
收藏
举报
序列化
这个比较简单, .net直接就支持, 以XML序列化为例:
[csharp]
view plain
copy
?
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);
}
}
[csharp]
view plain
copy
print
?
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;
}
}
结果如下:
[html]
view plain
copy
?
<?
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控件, 再这个窗口嵌入到主编辑器的界面
[cpp]
view plain
copy
?
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;
}
输出:
[plain]
view plain
copy
?
[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#脚本实践(三): 集成到游戏
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报
。
打开APP,阅读全文并永久保存
查看更多类似文章
猜你喜欢
类似文章
【热】
打开小程序,算一算2024你的财运
ANDROID轻量级JSON序列化和反序列化
JSON的序列化和反序列化
序列化反序列化 (binary/xml)
【C++ 序列化:从设计到实现】
TreeView序列化,TreeView串行化,TreeView反序列化 c# winfo...
网络,以人为本! 谈谈J2SE中的序列化之接受默认序列化1
更多类似文章 >>
生活服务
热点新闻
留言交流
回顶部
联系我们
分享
收藏
点击这里,查看已保存的文章
导长图
关注
一键复制
下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!
联系客服
微信登录中...
请勿关闭此页面
先别划走!
送你5元优惠券,购买VIP限时立减!
5
元
优惠券
优惠券还有
10:00
过期
马上使用
×