- 主题:如何写一个函数能够序列化任意结构
【 在 RunningOn 的大作中提到: 】
: 原来标题里说的“结构”不是指 struct 或 class ...
:
是struct。
用数据库生成模板,依据模板生成一个与对应结构一样布局的内存区域。
然后可以直接使用,也可以把这两东西转换成C程序文件输出。
57楼和58楼就是用数据库生成的,include到应用程序里就可以用了。
缺点是,数据结构如果改变,就要重新生成。
--
修改:ylh1969 FROM 221.218.61.*
FROM 221.218.61.*
嗯。JAVA的与我的对应功能叫ORM.
【 在 StephenLee 的大作中提到: 】
: 抱歉我以为楼主的SRM是供应链系统呢,原来还有别的含义,我狭隘了
--
FROM 221.218.61.*
怎么做到的?学习一下?
【 在 ylh0315 的大作中提到: 】
:
: 但是我做到了,利用映射机制,就是写一个结构说明书。
: 这办法对于已经存在的第三方软件的已知结构也适用,给它写个说明书。就是template。
: 【 在 poikilotherm 的大作中提到: 】
: : 没反射机制,做不到
#发自zSMTH@么么哒
--
FROM 223.104.41.*
最早,需要做一个3层客户服务器工具,要求安全高效的处理高并发事务。这个工具是别人开始做的。是一个通用平台,在之上可以架构各种应用。最基本的功能就是在网络传输各种不同的结构数据。那个时代JAVA刚刚出世,C++也刚刚冒头,还没有什么序列化反序列化的概念,只有一个想法,对任意不明结构数据打包拆包。数据是在不同平台互相传输,struct在各个平台,包括windows,unix,小型机,微机之间互相传送,它们的成员大小,大头小头和边界对齐规则都是不同的。
那时开始使用socket,程序也不复杂,也没有抵抗ddos什么的概念,我问到开发者,这个平台对应用的最大贡献是什么?答曰,任意struct的打包拆包程序。
当时的模板只有2个参数,类型,长度,offset都是现算的。
我研究了一下他的算法,改进一下,把offset加入模板,在第一次使用这个模板时需要进行一次计算,以后就直接使用offset,效率大为提高。
当时还没有json,xml啥的,就是类似csv的,用分隔符分割的字符串。
成功以后,考虑到sql语句的生成,模板里增加了成员名,格式,主要针对数据库的时间量,和bind标志,解决不完全表结构引用的问题,也就是不对所有列的访问。就是说,到这一步,就解决了对sql进行序列化和反序列化问题。
这时就有了一个好处,在大型系统开发时,数据结构是经常变化的,只需要调整模板,大部分程序不需要修改,从新编译即可。我们称为柔性编程。
大型数据结构,写模板,即繁琐又易错,所以,开发组有专人负责维护模板系统。
这时,提出一个要求,应用客户端需要下载一些固定信息,一些表,每个表要写一个程序。能不能只提供表名就可以下载任意表。于是研究了数据库的数据字典,读出并转换,就可以制成模板,从模板就可以生成struct。这就构成了通用模板库。从柔性编程提高到泛型编程的高度。
而且,模板可以存储也可以传输。在服务器里构建了动态模板库,某个客户端访问了一个表,就把这个表的模板存到本地模板库,以后再有要求这个表的,就不必从数据库生成了。当然这个模板库也是需要维护的,在运行中改变了数据结构,要进行相应的变更。
【 在 hyperLee 的大作中提到: 】
: 怎么做到的?学习一下?
:
: #发自zSMTH@么么哒
--
修改:ylh1969 FROM 221.218.61.*
FROM 221.218.61.*
和Google Protocol Buffers(protobuf)有什么差别?
【 在 ylh1969 的大作中提到: 】
: 最早,需要做一个3层客户服务器工具,要求安全高效的处理高并发事务。这个工具是别人开始做的。是一个通用平台,在之上可以架构各种应用。最基本的功能就是在网络传输各种不同的结构数据。那个时代JAVA刚刚出世,C++也刚刚冒头,还没有什么序列化反序列化的概念,只有一个想
: ǎ匀我獠幻鹘峁故荽虬鸢J菔窃诓煌教ɑハ啻洌瑂truct在各个平台,包括windows,unix,小型机,微机之间互相传送,它们的成员大小,大头小头和边界对齐规则都是不同的。
: 那时开始使用socket,程序也不复杂,也没有抵抗ddos什么的概念,我问到开发者,这个平台对应用的最大贡献是什么?答曰,任意struct的打包拆包程序。
: ...................
--
FROM 112.48.103.*
比他早。
是C泛型,不是C++泛型,但是C++可以用。
我的能做数据库。它的只能序列化反序列化JSON,xml什么的,做不了SQL。我这个相当于ORM,Object Relational Mapping。C没有Object,有struct,所以叫做SRM。
他们是编译期处理的,我是运行期处理的。
比如多个类似的表做相同的操作,写一个程序就行,代入哪个模板,就做哪个表。他们的不行,几个表就得写几个程序。
比如,6个类似表做去重,去掉重复记录,一个程序解决了。
理念不同,我们那时候讲究程序数据独立,一个程序,可以处理很多不同数据。也就是所谓泛型。
现在是OOP,数据和处理程序绑定在一起。有多少种数据就有多少种程序。
【 在 callmebbser 的大作中提到: 】
: 和Google Protocol Buffers(protobuf)有什么差别?
:
--
修改:ylh1969 FROM 221.218.61.*
FROM 221.218.61.*
比序列化反序列化更宽泛,包括了数据库处理。
可以在运行时处理。
例如:
客户端发出请求下载一个表,提供表名和检索条件,服务器按表名找到表结构,生成模板,再根据模板生成结构体数组。根据模板生成SQL语句。打开游标,绑定变量,执行语句,结果集自动进入结构体数组。
把这个数组序列化发到客户端。客户端根据模板将数据发序列化到本地结构体数组。
全过程就使用一个模板。
向数据库上传数据的过程类似。
这套机制要求不向客户端暴露数据库,不允许客户端直连数据库,必须通过服务器访问数据库。服务器是对客户端进行安全认证并授权。
【 在 callmebbser 的大作中提到: 】
: 和Google Protocol Buffers(protobuf)有什么差别?
:
--
修改:ylh1969 FROM 221.221.52.*
FROM 221.221.52.*
getColumn(i)是通过绑定变量实现的,在打开游标的时候就可以把每个列绑定到结构数组对应的字段。
这样在execute之后,结果集就已经在结构数组里啦。
模板在第一次被使用时就会计算offset,这个对齐问题考虑在内了。由于工具库是编译好放在运行库里的,.a或.so,使用时连接即可,成熟的,不需要临时调试。
使用时只需要#include 一些.h,-l一些库,很简单。
【 在 DoorWay 的大作中提到: 】
: 明白了,除了根据表定义生成数据结构,带正反序列化到某种指定结构化的文档或数据格式,
: 你的另一个研究点在于从数据库里拖出一块内存,像解析流一样,或先分行,再把每行分成字段(根据每个成员变量的描述,即字节长度),这样一大块内存(查询结果)就变成了多个C的结构体。
: 只考虑字节长度是不够的,还要考虑对齐问题。这用C语言来做描述挺合适。我的应用数据库不是重点,没考虑这个。不过好奇,每种数据库查询结果,内存块里各行的各字段,对齐是一样的吗?应该也需要实战调试到稳定吧。
: ...................
--
修改:ylh1969 FROM 221.221.52.*
FROM 221.221.52.*
是。每种数据库都有查询表结构的语句,各不相同。所以每种数据库的底层不同。
但是应用层是相同的,缺点是在一个程序里不能同时操作不同的数据库。
遇到过临阵换数据库的事。开始签约时用的ORACLE,都开干几周了,业主突然提出改DB2,经过2天时间更换了底层,上层程序基本不用修改。
【 在 DoorWay 的大作中提到: 】
: 换了一种数据库,你这也方案也得改改生成那部分代码,生成新表的“模板”,对吧?
--
修改:ylh1969 FROM 221.221.52.*
FROM 221.221.52.*
跟你们讲个成熟的方法,就是重新发明一种语言,简单的,然后需要序列化的,你都用这种语言。 再把这个语言转成c++. 解析的过程你是可以控制的,在这个过程,获取类的信息等。
--
修改:tortelee FROM 183.195.0.*
FROM 183.195.0.*