- 主题:C语言是怎么处理反射需求的?
这个已经有了解决方案,先mark一下。
--
FROM 221.221.52.*
一个网络通信,约定用json格式。但不规定结构的具体内容。
因此需要一对程序来进行序列化和反序列化。
struct_to_json(struct_p,json);
json_to_struct(json,struct_p);
这两个程序不知道传进来的struct是啥。
【 在 flw 的大作中提到: 】
: 这么说也对。
: 但这并不是说反射就绝对不可行。
: 其它语言的许多概念在 C 里面都是可以模拟出来的。
: ...................
--
FROM 221.221.52.*
那两个函数是库函数,早就编译好的。
怎么做?函数里不知道是啥结构。是运行时投放的任意结构。
不过,我告你答案,确实是switch,不止一个。
【 在 flw 的大作中提到: 】
: 这个简单,一个 switch 搞定
:
--
修改:ylh1969 FROM 221.221.52.*
FROM 221.221.52.*
看24楼。
在JAVA里很容易实现:
for 所有需要序列化的成员 {
取名字,值
加入JSON
…}
在C里怎么做?
在我们的系统里,C的服务器,JAVA的客户端。这个问题必须解决。
【 在 martinjspace 的大作中提到: 】
: c语言没这个需求。
--
修改:ylh1969 FROM 221.221.52.*
FROM 221.221.52.*
说对了。
实际上是做一个关于结构的说明书,程序按说明书操作。
我用一个结构数组来做。用vector可能更好。
【 在 flw 的大作中提到: 】
: 自己做个 map 类型就可以了。
: 这都是很常见的需求,有很常见的方案。
:
--
修改:ylh1969 FROM 221.221.52.*
FROM 221.221.52.*
如果你整个数据结构用map来做,并不能覆盖全部需求。有些第三方软件,人家提供的.h,本身含有许多结构。这些既有结构需要序列化时,没办法改成map。
我的方案是:可以给他们写一个说明书,然后纳入通用序列化/反序列化程序。
最近做了一个掌纹识别系统,软件是第三方的,相关的数据结构需要在客户机,服务器间传送,就采用如上方法。
【 在 flw 的大作中提到: 】
: 自己做个 map 类型就可以了。
: 这都是很常见的需求,有很常见的方案。
:
--
修改:ylh1969 FROM 221.221.52.*
FROM 221.221.52.*
不能。这些个结构在第三方软件里用,不能编译原来的库,没有源码。
【 在 martinjspace 的大作中提到: 】
: 每个需要反射的类型增加两个成员(数组),一个成员存放所有其他成员的名字,一个成员存放其他所有成员的偏移。
:
--
修改:ylh1969 FROM 221.221.52.*
FROM 221.221.52.*
嗯。
还一种方法,读.h,生成序列化反序列化代码。
【 在 flw 的大作中提到: 】
: 办法总比困难多,别气馁,方法多得很。
: 起码有三四种方法,具体情况具体分析,别人瞎猜也没用。
: 你看楼主一共也没说几句话,你猜的未必就比我猜的准。
: ...................
--
FROM 221.221.52.*
看24,26,28楼。
【 在 ylgao1987 的大作中提到: 】
: 用反射的都是懒人,所有反射都没必要,你是否知道反射效率极低?
:
--
修改:ylh1969 FROM 221.221.52.*
FROM 221.221.52.*
事实上,我是把这些内容存放在另外的说明书里。这个说明书称为template,简称tpl。使用时与结构的地址一并提交。
int struct_to_json(void * xxx_stu,template * xxx_tpl,JSON json);
【 在 martinjspace 的大作中提到: 】
: 每个需要反射的类型增加两个成员(数组),一个成员存放所有其他成员的名字,一个成员存放其他所有成员的偏移。
:
--
修改:ylh1969 FROM 221.221.52.*
FROM 221.221.52.*