- 主题:C语言是怎么处理反射需求的?
反射,就是取得对象的成员,其名称属性位置都是提供的。可惜C没有。
【 在 ztysys 的大作中提到: 】
: 但类名、需要的方法和属性也都是知道的
: 否则还是没法用
: 反射,说到底,还是对已知的类的调用,只是不知道方法和属性的偏移量而已,这时候编译执行器就弥补不足了,因为天生就是干这个的
: ...................
--
FROM 221.221.52.*
是一种方法。
但是:如果序列化/反序列化的格式不同,就需要生成太多的程序。
如:字符串格式,JSON格式,XML格式等等。
更有甚者,序列化/反序列化的发展------ORM,Object Relational Mapping, 把关系数据库的表,映射成Object,在C里,就是struct。实质上是struct对关系数据库的序列化/反序列化操作,这中间有太多的操作,代码生成太困难了。
所以,给结构补一张说明书。这说明书说明每个成员的:类型,长度,名称,格式,offset,还有一个bind,说明与关系数据库的对应关系。
【 在 Tyo 的大作中提到: 】
: code generation可解,参考thrift protobuf
--
修改:ylh1969 FROM 221.221.52.*
FROM 221.221.52.*
都写过。但是那不是ORM。
我用的是OCI,和DB2的CLI。
这比PROC的效率高得多,测试过,效率大约2.5倍。
而且,OCI经过包装,使用很简便。基本不用写SQL语句。有点像JAVA的HIBERNATE,只写HQL。
而且,软件在DB2与ORACLE之间的转换,分分钟的事,换个库,编译一下就行。
【 在 flw 的大作中提到: 】
: 这有啥困难的,
: 没写过 db2 的 sqc 和 oracle 的 pc?
:
--
修改:ylh1969 FROM 221.221.52.*
FROM 221.221.52.*
那么,OCI为什么一定要结构映射呢?
那是因为高效率的插入、修改操作,需要组织成数组,进行成组操作,结构数组是最方便的啦。
离散变量的数组,没办法写出通用的程序。
每一个成组插入,都要写一个程序。相当繁琐。
例如:
int array_insert(DAU,array,num);
DAU,Data Access Unit.里边有:表名,结构说明书,数据结构,游标,数据库句柄等等。(ORACLE与DB2的区别,仅在于数据库句柄不同)
array,你要插入的结构数组
num,数组的数量。
没有ORM,写不出这个程序。
【 在 flw 的大作中提到: 】
: 这有啥困难的,
: 没写过 db2 的 sqc 和 oracle 的 pc?
:
--
FROM 221.221.52.*
DAU可以由数据库的数据字典自动生成。包括里边的结构和说明书。
这些就是protobuf做不到的啦。
DAU_mk(&DAU,SQL_Connect,table_name);制造DAU,用数据库句柄,表名为。。。。
怎么样?比PROC简单吧?而且效率还非常之高。
在C++里,这个是new的过程。
【 在 flw 的大作中提到: 】
: 这有啥困难的,
: 没写过 db2 的 sqc 和 oracle 的 pc?
:
--
修改:ylh1969 FROM 221.221.52.*
FROM 221.221.52.*
是,见44,46,47楼。
【 在 ztysys 的大作中提到: 】
: 可以自己搭建一套机制
: 搞一套规则,也能实现一样的功能,C里面没有现成的,但搭个简陋的也不困难
:
--
FROM 114.253.160.*
反射应该是指运行时解析结构内容吧?
例如一个函数,接受到一个未知的结构或对象,分析其内容进行处理。
【 在 freyoneby 的大作中提到: 】
: vxworks 的shell应该算反射吧,可以看看它源代码怎么弄的
--
FROM 221.221.51.*
一个函数:
struct_to_JSON(void *struct_p,JSON json);
这函数怎么弄?你根本不知道struct_P里边啥。
就得靠反射找出其内容。
这就是反射需求。
【 在 freyoneby 的大作中提到: 】
: 运行时都是pc指令和内存地址,还有结构存在?,除非在数据区存畜这些结构,那要多大的内存,小工程还可以,大工程只能隔屁
--
FROM 221.221.51.*
以上是例子。实际中映射数据库表是更常见的,一个中型项目,处理百十来个表,要写几百个程序。用反射,一组程序就够了
【 在 freyoneby 的大作中提到: 】
: 运行时都是pc指令和内存地址,还有结构存在?,除非在数据区存畜这些结构,那要多大的内存,小工程还可以,大工程只能隔屁
--
FROM 221.221.51.*
每个成员都标?
我可是针对普通结构,甚至是第三方软件的结构,改不得的。
【 在 wdrq83 的大作中提到: 】
: 这个太简单了,结构体第一个byte标识数据类型即可
--
FROM 221.221.51.*