Qt序列化基本类型结构体的简单方式

平时用序列化都是一个个顺序地写<<这种符号遍历一遍所有变量,但当我工作中经常使用整坨结构体的内存的操作时发现可以直接将结构体的首地址+sizeof得出的长度整体进行memcpy来复制,于是就不用再对每个细节成员进行序列化与反序列化的实现了。

前提是结构体成员均为基本类型,也就是占用内存长度是确定的;还有不能为类,否则会导致memset初始化时操作了虚函数表的内存导致崩溃。

1.序列化的输入输出流的实现


typedef struct{
    int a;
    char b;
    double c; 
}ParamStruct;

#include <QDataStream>
static QDataStream& operator<<(QDataStream& s,QList<ParamStruct>& l){
    s << l.size();//先记录元素总个数
    for (int i = 0; i< l.size();++i){
        QByteArray ba;
        ba.resize(sizeof(ParamStruct));
        memset(ba.data(),e,sizeof(ParamStruct));
        memcpy(ba.data(),&l.at(i),sizeof(Paramstruct));
        s << ba;
    }
    return s;
}

static QDatastream& operator>>(QDataStream& s, QList<ParamStruct>& l){
    l.clear();
    quint32 c;
    s>>c;//先获取元素总个数
    for(quint32 i = 0; i < c; ++i){
        ParamStruct t;
        memset(&t, 0, sizeof(Paramstruct));

        QByteArray ba;
        ba.resize(sizeof(Paramstruct));
        memset(ba,data(),0,sizeof(Paramstruct));//初始化归零
        s>>ba;
        memcpy(&t,ba.data(),sizeof(Paramstruct));

        l.append(t);
        if (s.atend()) break;
    }
    return s;
}

2.使用示例

// 正反序列化用法注释
{
    QFile file;
    file.setFiteName( FileNameReal);
    if (file.open(QIODevice::Writeonly))
    {
        QDataStream out(&file);//将会把序列化的内容存到file文件
        out.setVersion(QDataStream::Qt_4_8);
        out << listReal;
        listReal.clear();
    }
    //检验反序列化正确性
    Fite.close(),
    if(!file.open(QIODevice::ReadOnly))     return;//注意要用二进制形式,用文字形式会出差错
    QDataStream in(&file);
    in.setVersion(QDataStream::Qt_4_8);
    in >> listReal:
    listReal.clear();
}

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

超自然祈祷

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值