本文在前文的基础上作了一下扩展安全
<DataDef> <Field key="cardNo" length="19"/> <Field key="amount" length="13"/> <Field key="tradeDate" length="8"/> <Field key="tradeTime" length="6"/> </DataDef>
数据key | 长度 | 偏移 |
cardNo | 19 | |
amount | 13 | 20 |
tradeDate | 8 | 36 |
tradeTime | 6 | 48 |
数据的内部存储方式可用字符串形式,无论是整数,浮点数,数据读取和写入的接口最核心的就是相似这种形式: 数据结构
int getDataStr(const void* dataAddr, const char* szKey, const int iBufLen, char* szValue); int putDataStr(void* dataAddr, const char* szKey, const char* szValue);
dataAddr是全部的数据存储地址,根据szKey查找到对应数据的偏移(若是数据域多可在载入配置后可将key排序,查找时经过二分查找等方法),以后进行读取或者写入,至于其余的类型在这个基础上将字符与成整型,浮点型等互转便可。并且数据内部自然带长度,在写入的时候能够进行检查,不能超过xml文件中的长度,在一个地方限制了内存溢出的BUG。线程
int getDataInt(const void* dataAddr, const char* szKey, int* iValue); int setDataInt(void* dataAddr, const char* szKey, const int iValue); int getDataDouble(const void* dataAddr, const char* szKey, double* dValue); int setDataDouble(void* dataAddr, const char* szKey, const double dValue);
到此已经完成了一个最简单的设计,相对真正的动态Map的实现最大的区别是全部用到的值的key必须预先定义好,可是值所放置的位置在载入时都已经肯定,在访问时不须要进行动态的内存申请和释放,保证了必定的效率,并且在Linux/Unix系统中,内部结构数据可放在共享内存中,这样多进程均可访问(如有须要可将数据的访问接口实现成线程安全的),无需将数据在进程间进行传递。设计