c++/qt的数据序列化和反序列化

时间:2022-10-06 12:33:42

序列化以及反序列化的实现


struct Body

{
    double weight;
    double height;
};
//结构体
struct People
{
    int age;
    Body dBody;//结构体
    vector<QString> vecfamily;//vector
    //序列化
    friend QDataStream &operator<<(QDataStream& input,const People &iteam)
    {
        //vector 数据类型需要用vector<People>::fromStdVector 转一下
        //如果是QList则不需要直接插入
        QVector<QString> strvecfamily = QVector<QString>::fromStdVector(iteam.vecfamily);
        input << iteam.age << iteam.dBody.height << iteam.dBody.weight\
              << strvecfamily;
        return input;
    }
    //反序列化
    friend QDataStream &operator>>(QDataStream& output,People& iteam)
    {
        QVector<QString> vecfamily;
        output >> iteam.age >>iteam.dBody.height >> iteam.dBody.weight >> vecfamily;
        iteam.vecfamily = vecfamily.toStdVector();
        return output;
    }
};

数据的使用
People p1;
    p1.age = 12;
    p1.dBody.height = 150.8;
    p1.dBody.weight = 50;
    p1.vecfamily.push_back("sister");
    p1.vecfamily.push_back("mother");
    p1.vecfamily.push_back("father");

    QFile file("./stream.bat");
    if(!file.open(QIODevice::WriteOnly))
    {
        return ;
    }
    QDataStream input(&file);
    input << p1;
    file.close();

    People p2;
    QFile file1("./stream.bat");//.bat文件为二进制文件
    if(!file1.open(QIODevice::ReadOnly))
    {
        return ;
    }
    QDataStream output(&file1);
    output << p2;
    file.close();

    output >> p2;

    qDebug()<<p2.age<<p2.dBody.height<<p2.dBody.weight\
           <<p2.vecfamily;//结果12 150.8 50 std::vector("sister", "mother", "father")