应用需求:
在网盘开发过程中有这样一个需求,即对文件版本进行控制,即记录文件版本的更替信息,这里说的更替信息仅仅是记录不同时刻的文件变化,即文件的增、删、改、重命名等操作。在每个待监控的目录下都会保存一份文件,记录文件变化的增量信息,每次低版本到高版本升级的时候就可以通过消元合并操作快速地进行。关于文件版本控制的具体实现方案会在开发完善后列出,这里仅仅指出它的保存方式,即将文件操作的实例对象序列化后保存在文件中。
序列化的实现:
这里我们采用QDataStream来实现序列化,QT针对不同的实例化对象有不同的要求。这里主要分两类,即:QT中原生的数据类型,例如:QString、QMap、QHash等,这对这种原生数据类型的序列化,我们不需要做其它额外的操作,直接就可以序列化到文件中。还有一类特殊的就是我们自己定义的数据结构或类,这种方式利用QDataStream不能直接实现序列化,我们必须重载<<和>>操作符,只有重载完之后才可以按我们的要求实现序列化。下面就举例来说明一下,我们自定义的数据结构或类应该如何实现序列化:
自定义的类:LHTFileVersionItem,该类用来记录某一个操作,它的定义为:
#ifndef LHT_FILEVERSIONITEM_H
#define LHT_FILEVERSIONITEM_H
#include <QDataStream>
struct FileVersionItem
{
QString m_sFileAbsolutePath ;
QString m_sFileOrgName ;
QString m_sFileNowName ;
int m_sFileType ;
QString m_sFileMoveFromAbsolutePath ;
QString m_sFileMoveToAbsolutePath ;
};
class LHTFileVersionItem
{
public:
LHTFileVersionItem();
~LHTFileVersionItem();
void setVersion(int version);
void setOp(int op);
int GetVersion();
int GetOp();
FileVersionItem* GetFileVersionPointer();
friend QDataStream &operator<<(QDataStream & , const LHTFileVersionItem &);
friend QDataStream &operator>>(QDataStream & , LHTFileVersionItem &);
private:
int m_iVersion;
//!-1:delete 1:crate 2:change
//!3:rename 4:move
int m_iOp;
FileVersionItem *m_hFileVersionPointer ;
};
#endif // LHT_FILEVERSIONITEM_H
其中,friend QDataStream &operator << 和 friend QDataStream &operator >>就是声明的对操作符的重载。注意:这里我们使用了friend来声明为友元函数,这里对friend关键字做些介绍:
何谓友元?为什么要使用友元?我们知道,采用类的机制后实现了数据的隐藏和封装,类的数据成员一般定义为私有成员,成员函数一般定义为公有的,依此提供类与外界间的访问接口。但是,有时需要