模式(Schema)做好后,接下来就是实际的数据了。也就是表(Table)和记录(Record)。先从记录开始吧。
记录,也就是表中的一行数据。这里有个难点,就是表的模式是不定的,其属性的个数、值类型都是动态的,所以怎么样能在记录中保存[数量、类型不定的值]呢?这里我用的是保存指针的方法,也就是:Record中实际保存的是指针的列表,然后这些指针指向了实际要保存的数值;同时,这些指针在保存时都以DWORD*的类型保存,而Record中提供了GetPrptyType(int nPrptyIndex)函数用以获得该指针的实际类型。
下面上代码吧。
// LzjTable中的一行 // 对于可变长度的属性(如LString),自动以4字节对齐方式进行填充 class LzjRecord{ public: LzjSchema *m_pSchema; // 本LzjRecord所用的模式。外生变量:即,直接复制调用方的对象指针到本对象的相应成员变量中,由调用方维护本对象(此处为m_pSchema)的生命周期 // DWORD *m_pdwData; // LList<DWORD*> m_pPrptyList; // 本LzjRecord的属性 LPDWORD *m_pValueList; // [本数组中的每个元素]均指向一个属性。因为属性的类型不同,所以只能以LPDWORD来作为属性的指针,然后通过GetPrptyType()来获得该属性的具体类型。内生变量:即,将调用方的对象复制到本对象的相应成员变量中,由本父对象(此处为LzjRecord)维护本对象(此处为m_pValueList[])的生命周期 public: LzjRecord(); LzjRecord(LzjSchema *pSchema); ~LzjRecord(); void Init(LzjSchema *pSchema); // 由pSchema初始化:m_pSchema和m_pValueList void SetPrpty(int nPrptyIndex, DWORD *pdwValue); // 设置第nPrptyIndex(从0起)个参数的值。生成内生变量 LPDWORD GetPrpty(int nPrptyIndex); LzjProperty::LP_ValueType GetPrptyType(int nPrptyIndex); // 获得属性类型 void ConsoleOut(std::ostream *pCout); DWORD Serialize(LFile *pFile); // 序列化 DWORD Unserialize(LFile *pFile); // 反序列化 };
时间: 2024-10-24 14:42:11