Qt序列化

Qt 序列化

一、序列化概念

将对象或数据结构转换为一种可存储或传输的格式的过程,通常这种格式是二进制序列或者文本格式如JSON、XML等。

序列化出来的数据,可通过反序列化得到原本的数据,并且合理的序列化操作,可以包容各种类型的转换。

在这里插入图片描述

作用场景:在Qt中,序列化有着广泛的应用,主要包括:

  • 数据对象状态保存‌:持久化数据,将对象的当前状态序列化为文件或数据库记录,以便在程序关闭后仍能恢复这些数据。
  • 网络通信‌:将数据对象序列化为二进制或文本格式,通过网络传输到远程端,远程端再反序列化为对象。
  • 跨平台数据交换‌:不同平台间的应用程序可以通过序列化数据来进行数据交换。

Qt常用方式:

  • QDataStream

    • 适用于二进制序列化,处理效率高。

    • 常用于文件存储和网络传输。

  • QJsonDocumentQVariant

    • 适用于 JSON 格式的序列化,便于调试和跨平台数据交换。

    • 常用于配置文件、RESTful API 数据交换。

二、序列化和反序列化流程

  • Qt中自带有QDataStream类,可实现序列化操作;
  • 其中Qt自带的类型,可以直接使用“<<”、“>>” 两个运算符做序列化和反序列化操作,
  • 自定义数据结构和类不能直接序列化和反序列化,需要重写操作符函数才能使用。

1.原生数据类型

流程:

  • 定义需要序列化的数据
  • 创建QDataStream数据流对象,设置容器及其打开方式
  • 通过<<和>>写入或读出
//序列化
QFile file("file.dat");         //创建一个文档
file.open(QIODevice::WriteOnly);//打开并只写
QDataStream out(&file);         //序列化文档
out << QString("the answer is");//将字符串写入文档中,实际在该文档中为二进制
out << (qint32)42;
  
//反序列化
QFile file("file.dat");
file.open(QIODevice::ReadOnly);
QDataStream in(&file); 
QString str;
qint32 a;
in >> str >> a; 

2.自定义数据结构或类

流程:

  • 自定义一个数据类型CSampleData,重载<<和>>,参数为(QDataStream& in, CSampleData& data)
  • 使用流程同上(实例化类对象,创建数据流对象,使用<<和>>进行写入读出)
class QSampleData : public QObject
{ 
public:
    QChunnelData();
    virtual ~QChunnelData();
    QChunnelData& operator=(const QChunnelData &other);

    friend QDataStream& operator>>(QDataStream&, QChunnelData&);
    friend QDataStream& operator<<(QDataStream&, QChunnelData&);
    
    //定义的数据成员
    int m_nType;
    QString m_strName;
};
 
CSampleData::CSampleData()
{
    m_nType = 0;
    m_strName = "";
}

CSampleData::~CSampleData()
{
}

CSampleData::operator =(const CSampleData& other)
{
    m_nType = other.m_nType;
    m_strName = other.m_strName;
    return *this;
}

QDataStream& operator>>(QDataStream& in, CSampleData& data)
{
    in >> data.m_nType >> data.m_strName;
    return in;
}

QDataStream& operator<<(QDataStream& out, CSampleData& data)
{
    out << data.m_nType << data.m_strName;
    return out;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值