- 主题:如何写一个函数能够序列化任意结构
做个标记,以后可以借鉴这个延迟计算offset
【 在 ylh0315 的大作中提到: 】
: //这个就是所谓的“模板”了,它使我们能够"看"到未知结构的内容。
: typedef struct {
: INT4 type;
: ...................
--
FROM 111.201.54.*
对。
计算只一次,所以效率很高。
【 在 emwanwei 的大作中提到: 】
: 做个标记,以后可以借鉴这个延迟计算offset
:
--
FROM 221.218.61.*
……
你这还得把数据类型重新写一遍啊。我以前写的ASN.1的序列化绑定长这样
起码字段类型是自动识别了。
struct SubSeq {
int f_int1;
long long f_int2;
};
SN1_BIND_SEQUENCE_BEGIN(SubSeq) {
ASN1_BIND_FIELD_SIMPLE(f_int1),
ASN1_BIND_FIELD_SIMPLE(f_int2),
} ASN1_BIND_SEQUENCE_END(SubSeq);
【 在 ylh0315 的大作中提到: 】
: 现在给它配模板:
: T_PkgType st_tpl[]={
: {CH_TINY,1,"c",0,-1},
: ...................
--
FROM 220.249.52.*
跟以前DAO那套的区别是什么?
从数据库表定义,生成:
1 结构体的定义,
2 注册成员变量的代码 // 一会发个链接
3 带两个静态函数,from(xml*) to(xml*) // 也可以是json或任何其他格式
没有模板的概念,从“代码自动生成”的角度看,更好理解吧。
是你的from/to更高效吗?
【 在 ylh0315 的大作中提到: 】
: 你这个也行。
: 不过,你看58,59楼,
: 模板中的数据结构远比struct丰富,它是按照数据库的数据类型定义的。
: ...................
--
FROM 61.185.187.*
我觉很像protobuf互转json的实现原理
【 在 ylh0315 的大作中提到: 】
: 你这个也行。不过,你看58,59楼,模板中的数据结构远比struct丰富,它是按照数据库的数据类型定义的。所以用结构生成 ...
--
FROM 49.93.165.*
你这个只适合搞逆向的事情,比如你说的SRM系统。自动化生成你的模板,前提是数据库schema是定义好的。
ORM一般是正向来干的,用户代码定义结构体,编译自动生成数据库访问相关代码,运行时自动建表
【 在 ylh0315 (ylh0315) 的大作中提到: 】
: 数据库的数组操作是非常繁琐的,有必要写个公用程序,才能简化操作普遍使用。
: 其中最难的就是绑定变量,需要逐个点名,取回结果集也需要逐个点名。
: 所以有了这个模板,就可以在模板里逐个点名。一个循环就可以解决所有问题。
: 有了这个公用程序,在你的系统里就可以到处使用数据库的批量操作,大大提高你的程序的性能。
--
FROM 122.233.132.*
我在上家公司做过。把内存中的结构体输出成可读文件,每行包含嵌套的字段名字,以及数值。还能发过来,把可读的这种文件反向读出,写入结构体指针指向的内存之中。
方法就是借助编译可执行文件种的DWARF信息(需要打开编译选项,如果你不想生成文件种包含dwarf可以改你的编译架构,专门生成一个包含dwarf信息的小程序专门给解析器用)。关于DWARF信息可以参考gdb和dwarfdump工具。
dwarf解析的部分我用dwarfdump源代码改造了一下,dwarfdump原始功能是把可执行文件种的dwarf打印出来,我把打印功能去掉,改成在内存种生成dwarf tag树。
有了dwarf tag 树,你就可以计算出每个字段相对结构体起始位置的偏移量了(嵌套结构体需要递归算法实现这个),也就可以把结构体内容输出出来。
相反的,有了dwarf tag树,你也可以把输出来的文件给都回内存,摆放在内存种的位置。
此类功能gdb有,但是gdb代码规模过大,我没能理清,最后实现的是自己琢磨出来的土方法。
--
FROM 49.5.229.*
你有一篇博客在完整的描述这个方案吗?
我也做过一个类似的,读sqllite的表结构,每张表生成一个对应的结构体,带From/To函数。
当时的需求是xml。
大概用了2,3天。当时认为是个“自动生成代码”的任务。
处理From/To的实现逻辑:
写一个C++的模板类(Property,描述属性),类型参数是结构体T,成员变量是T*和T::*p, 即实例和成员变量指针;
注册时,用struct的类型做key,把该struct的所有属性组成tuple放到一个全局静态Map里。
To,就是遍历tuple的成员,读结构体的值写到xml里
From,就是读xml的值,赋值给结构体,From需要传一个实例指针来。
花时间的点,就在于用查template的var args 用法,和make_index_sequence,在编译期遍历tuple。
我觉得这种成员变量指针的模型,也是base + offset的实现。
C的实现是有什么高级的地方吗?
本来我认为挺简单的东西,看了你的东西给我糊涂了。或许我理解太浅了。
还是说,你的重点是针对数据库插入的优化?你应该写个博客,把几个点分开来谈。
【 在 ylh0315 的大作中提到: 】
: from和to,是通用工具,放在.so,或.a里。
: 在写这个from和to的时候,你不知道要处理的结构是谁。只知道是void *。所以是泛型程序,不针对任何特定的数据。
: 处理效率也是非常高的。
: ...................
--
修改:DoorWay FROM 61.185.187.*
FROM 61.185.187.*
换了一种数据库,你这也方案也得改改生成那部分代码,生成新表的“模板”,对吧?
【 在 ylh0315 的大作中提到: 】
: from和to,是通用工具,放在.so,或.a里。
: 在写这个from和to的时候,你不知道要处理的结构是谁。只知道是void *。所以是泛型程序,不针对任何特定的数据。
: 处理效率也是非常高的。
: ...................
--
FROM 61.185.187.*
我不太懂名词哈。以为就是个从表定义,生成数据结构(带俩From/To)的过程。
【 在 ylh0315 的大作中提到: 】
: 没有ORM能写出DAO?
: 映像器是DAO的基础。
: 我实现了DAU,Data Access Unit。
: ...................
--
FROM 61.185.187.*