- 主题:如何写一个函数能够序列化任意结构
- 做个标记,以后可以借鉴这个延迟计算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.*