`
qimo601
  • 浏览: 3449361 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

Qt持久性对象进行序列化

阅读更多

转载:http://cool.worm.blog.163.com/blog/static/64339006200832642918250/

Mfc和Java中自定义类的对象都可以对其进行持久性保存,Qt持久性对象进行序列化当然也是必不可少的。
不过这个问题还真困扰了我很长时间……
Mfc通过重写虚函数Serialize()、Java则是所属的类必须实现java.io.Serializable或Externalizable接口完成、
Qt是怎么搞定这个事情那,QDataStream类:让我们不禁想起Mfc中的CAchive类、
Java中的java.io.ObjectOutputStream/ObjectInputStream类,分别提供了对象的序列化和反序列化功能。
现在还差什么了,那就是">>"和"<<"的实现了。
哈哈,c++中friend友员派上用场了。假设你的类是QSampleData,实现以下俩个函数就可以了
    #ifndef QT_NO_DATASTREAM
        friend QDataStream& operator>>(QDataStream&, QSampleData&);
        friend QDataStream& operator<<(QDataStream&, QSampleData&);
    #endif
当时这里不能忽略的事就是,QSampleData从QObject直接或间接派生,有个不带参数的构造函数,这都是老生常谈了~


一个例子,这也是必须的。

//比较懒,这次的注释就免了...
class QSampleData : public QObject

public:
    QChunnelData();
    virtual ~QChunnelData();
    QChunnelData& operator=(const QChunnelData &other);

#ifndef QT_NO_DATASTREAM
    friend QDataStream& operator>>(QDataStream&, QChunnelData&);
    friend QDataStream& operator<<(QDataStream&, QChunnelData&);
#endif 
    //定义的数据成员
    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;
}
#ifndef QT_NO_DATASTREAM
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;
}
#endif

这样就QFile、QByteArray...可以关联QDataStream类的对象,进行读写操作了。

QSampleData data;
data.m_nTpye = 12;
data.m_strName = "vic.MINg";
QFile file("file.dat");
file.open(QIODevice::WriteOnly);
QDataStream out(&file);
out << data;
file.close();
file.open(QIODevice::ReadOnly);
QDataStream in(&file);
in >> data;
file.close();

分享到:
评论

相关推荐

    qt 开发文档大全

    ./Qt持久性对象进行序列化.pdf ./Qt新渲染底层Scene Graph研究3.pdf ./Qt模块化笔记之Qt_Quick--用QQuickImageProvider给Image组件添加图片.pdf ./QT中emit,signal,slot.pdf ./Q_PROPERTY.pdf ./QT高级编程_chs.pdf ...

    Qt自定义结构序列化

    对于自定义类型,我们需要实现QDataStream的操作符和&gt;&gt;以便正确地序列化和反序列化对象。 1. **自定义类型和QDataStream** - 首先,定义一个自定义结构或类,例如`MyStruct`,包含一些成员变量。 - 接下来,添加...

    序列化和反序列化(文本加密成二进制文件)

    在IT领域,序列化和反序列化是两个关键概念,主要应用于数据持久化、网络通信以及对象存储等场景。序列化是指将一个对象的状态转换为可存储或传输的形式,通常是二进制流;反序列化则相反,是将这个二进制流恢复为...

    QSerializer:此存储库用于基于QtCore的JSON或XML中的QtC ++序列化对象

    QSerializer是一个针对QtC++应用程序的库,它专注于在JSON和XML数据格式中进行对象的序列化和反序列化。这个库是建立在Qt的QtCore模块之上,利用了Qt的元对象系统(Meta-Object System)和C++的特性,如宏(macro)...

    QT Qudpsocket 传送结构体数据

    总结来说,`QT`中的`QUdpSocket`是处理UDP网络通信的关键组件,而结构体数据的传输则需要结合序列化和反序列化技术。通过多线程,我们可以确保网络操作不影响主线程的响应性,同时将接收到的数据持久化到TXT文件,...

    QtProtoBuf

    它简化了数据交换的复杂性,提高了代码的可读性和可维护性,是Qt开发者处理序列化和通信协议的理想工具。在实际项目中,QtProtoBuf可以用于构建服务端与客户端之间的通信协议,也可以用于游戏中的数据同步,甚至是...

    基于C++的qt流程图设计

    10. 反序列化与序列化:为了保存和加载流程图,需要实现序列化和反序列化机制,将流程图的状态转换为文件格式(如XML或JSON),并在需要时读取。 11. GUI设计:使用Qt Designer工具可以快速构建流程图的用户界面,...

    Qt界面软件控制Unity中物体旋转移动(QT端)

    4. **数据序列化与反序列化**:发送到Unity的控制命令需要被编码为字符串或二进制格式。这通常涉及将旋转角度和移动距离转换为JSON或自定义的结构化数据,然后发送到Unity。 5. **Unity客户端**:在Unity中,你需要...

    Qt实现组织结构图

    Qt提供了一些类,如`QXmlStreamReader`和`QXmlStreamWriter`,方便进行序列化和反序列化操作。 8. **性能优化**:在处理大量节点时,可能需要考虑性能问题。可以使用`QGraphicsItem::setFlags`来禁用不必要的事件...

    Qt局域网QQ

    总的来说,"Qt局域网QQ"是一个学习Qt网络编程和UI设计的实践项目,通过这个项目,开发者可以掌握Qt中的网络通信、UI构建、数据序列化以及用户交互等多个关键知识点,为进一步的Qt应用开发打下坚实基础。

    Qt流程图大作业流程图编辑器,基本流程图功能均有

    总结,这个"Qt流程图大作业流程图编辑器"项目涉及了图形用户界面设计、图形绘制、事件处理、数据持久化等多方面的技术,对于学习和掌握Qt库以及C++编程有着很好的实践意义。通过完成这个项目,开发者不仅可以提升...

    精通Qt4编程(第2版) 源码

    6. **文件I/O与数据存储**:Qt4提供了方便的数据读写和序列化工具,如QFile、QTextStream和QDataStream。源码会包含文件操作和数据持久化的实例。 7. **多线程编程**:Qt4的QThread类使得多线程编程变得简单,同时...

    QT之QDataStream和QSettings

    3. **版本控制**: 序列化的数据可以包含版本号,以便在数据格式更改时进行兼容性处理。 4. **类型标签**: 每个数据类型前都会加上一个标签,使得在反序列化时能够识别数据类型。 **QSettings** QSettings类用于读写...

    Qt实现高级组织结构图

    这将涉及到序列化和反序列化QGraphicsItem及其关联数据的过程。 7. **优化性能**:在处理大量节点时,可能需要考虑性能优化,例如使用QGraphicsProxyWidget来提高复杂视图的性能,或者使用Qt的缓存机制。 8. **...

    Qt5+C++ +cereal

    cereal则是一个轻量级的序列化库,能够方便地将对象的状态保存到和恢复自各种持久性存储中。 首先,标题“Qt5+C++ +cereal”表明我们的项目是利用这三种技术进行集成开发。Qt5提供了丰富的图形用户界面(GUI)组件...

    基于QT的智能家居设计.zip

    6. **JSON 支持**:智能家居设备通常使用JSON格式交换数据,QT库内置了对JSON的支持,方便解析和序列化数据。 7. **设备模拟与控制**:在“SmartHome-Qt-master”项目中,可能会有模拟智能家居设备状态的代码,以及...

    基于Qt的智能家居模拟客户端,对应多线程服务器

    Qt的`QJsonDocument`和`QJsonObject`等类可以帮助我们处理JSON数据的序列化和反序列化。 4. **GUI设计**:使用Qt Designer工具,开发者可以可视化地设计用户界面,然后将设计导出为.ui文件,再通过Qt的moc预处理器...

    QT实战项目五--计算器

    - **数据持久化**:如果需要保存用户的计算历史或设置,可以利用QT的序列化能力,将数据存储到文件中。 - **错误处理**:计算器应用需要处理除零、非法运算等情况,确保程序的健壮性。 通过这个QT实战项目,你可以...

    基于QT_C++嵌入式聊天系统设计与实现源码论文答辩ppt.zip

    5. **消息序列化和反序列化**:在发送和接收消息时,需要将消息对象转换为可传输的字节流,这涉及到C++的对象序列化技术。 6. **安全性和隐私保护**:聊天系统可能涉及加密算法,如SSL/TLS,用于保护通信的安全性,...

    qt环境下的局域网聊天室

    客户端通过监听socket的readyRead()信号,读取接收到的数据,然后反序列化恢复成消息对象。QT的QTcpSocket类提供了read()方法用于读取接收到的数据。 4. 局域网通信:由于这个聊天室只支持局域网,因此我们不需要...

Global site tag (gtag.js) - Google Analytics