QDataStream 可以序列化QT基本数据类型,也可以序列化自定义结构体和类,配合QIODevice进行二进制流的输入输出。
一、QT基础数据类型 容器
定义变量
// QT基础数据类型
QString param1 = "ABC";
int param2 = -1234;
uint param3 = 5678;
double param4 = 123.456;
// QT容器
QMap<QString, int> map;
data.map["one"] = 1;
data.map["two"] = 2;
data.map["three "] = 3;
data.map.insert("four", 4);
写
QFile writeFile(QApplication::applicationDirPath() +"/test.dat");
writeFile.open(QIODevice::WriteOnly);
QDataStream out(&writeFile);
out << param1 << param2 << param3 << param4;
out << map;
writeFile.close();
读
QFile readFile(QApplication::applicationDirPath() +"/test.dat");
readFile.open(QIODevice::ReadOnly);
QDataStream in(&readFile);
in >> param1 >> param2 >> param3 >> param4;
in >> map;
readFile.close();
二、结构体
定义结构体
typedef struct __ProjectData{
QString str;
QMap<QString, int> map;
} ProjectData;
ProjectData data;
重载序列化和反序列化
在h文件中需要加inline
// 重载序列化
QDataStream & operator<< (QDataStream& stream, const ProjectData& data){
stream << data.str;
stream << data.map;
return stream;
}
// 重载反序列化
QDataStream & operator>> (QDataStream& stream, ProjectData& data) {
stream>>data.str;
stream>>data.map;
return stream;
}
顺便重载qDebug()的实现自定义类型的打印
QDebug operator<<(QDebug dbg, const ProjectData &data)
{
dbg.nospace() << "ProjectData()";
dbg.nospace() << "str(" << data.str << ")";
dbg.nospace() << "map(" << data.map << " ...)";
return dbg.maybeSpace();
}
写
QFile writeFile(QApplication::applicationDirPath() +"/test.dat");
writeFile.open(QIODevice::WriteOnly);
QDataStream out(&writeFile);
out << data;
qDebug()<<data;
writeFile.close();
读
QFile readFile(QApplication::applicationDirPath() +"/test.dat");
readFile.open(QIODevice::ReadOnly);
QDataStream in(&readFile);
in >> data;
qDebug()<<data;
readFile.close();
三、自定义类
类似结构体
定义类,加入序列化功能
class CData
{
public:
CData(){};
QString str;
QMap<QString, int> map;
// 序列化
friend QDataStream & operator<< (QDataStream& stream, const CData& data){
stream << data.str;
stream << data.map;
return stream;
}
// 反序列化
friend QDataStream & operator>> (QDataStream& stream, CData& data) {
stream>>data.str;
stream>>data.map;
return stream;
}
// 支持qDebug
friend QDebug operator<<(QDebug dbg, const CData &data)
{
dbg.nospace() << "CData()";
dbg.nospace() << "str(" << data.str << ")";
dbg.nospace() << "map(" << data.map << " ...)";
return dbg.maybeSpace();
}
};
CData cdata;
写
QFile writeFile(QApplication::applicationDirPath() +"/test.dat");
writeFile.open(QIODevice::WriteOnly);
QDataStream out(&writeFile);
out << cdata;
qDebug()<<cdata;
writeFile.close();
读
QFile readFile(QApplication::applicationDirPath() +"/test.dat");
readFile.open(QIODevice::ReadOnly);
QDataStream in(&readFile);
in >> cdata
qDebug()<<cdata;;
readFile.close();
四、事务
通过事务机制可以在流上执行一次完整的流读取,如果读取出错,不会破坏原有的流状态。再重新执行一次事务即可恢复。这简化了异步操作。不需要进行额外的出错检查。
QDataStream in(&writeFile);
in.startTransaction();
// ……
if(true == in.commitTransaction()) {
}
……