QT学习 QDataStream 序列化


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()) {
        
    }

……

  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值