精华内容
下载资源
问答
  • 对象序列化,简单地讲就是把程序运行时保存在内存中的某个对象,整个抽取出来,从而可以实现将这个对象进行持久性保存(如普通文件存储、数据库),或者网络传输。今天在一个QT项目上刚好有这样的一个需求,网上也看...

    对象序列化,

    简单地讲就是把程序运行时保存在内存中的某个对象,整个抽取出来,从而可以实现将这个对象进行持久性保存(如普通文件存储、数据库),或者网络传输。


    今天在一个QT项目上刚好有这样的一个需求,网上也看了一些资料,主要的思想就是就是利用QDataStream,重载其<< 和 >>
    操作符实现(虽然重载的原因是因为 QDataStream << 和 >>
    操作符只支持C++内置的基本数据类型,但我觉得实际上,重载操作符过后本质上并没有什么变化,因为你必须去实现operator重载的内部实现,而在实现的过程中,依然必须以基本数据类型为单位进行写入)。现在将QT的测试代码整理出来:

    DataClass.h

    #ifndef DATACLASS_H
    #define DATACLASS_H
    #include <QDataStream>
    #include <QObject>
    #include <QtCore>
    #include <queue>
    using namespace std;
    class DataClass : public QObject
    {
        Q_OBJECT
    public:
        explicit DataClass(QObject *parent = 0);
    public:
        int id;//数据项
        QString name;//数据项
        queue<int> que;//数据项
    public:
        friend QDataStream &operator<<(QDataStream & , const DataClass &);
        friend QDataStream &operator>>(QDataStream & , DataClass &);
    signals:
    
    public slots:
    };
    
    #endif // DATACLASS_H

    DataClass.cpp

    #include "dataclass.h"
    
    DataClass::DataClass(QObject *parent) : QObject(parent)
    {
    
    }
    
    QDataStream & operator<<(QDataStream & output, const DataClass &obj)
    {
        output << obj.id <<obj.name;
        queue<int> tmpQue = obj.que;
        while(!tmpQue.empty())
        {
            output<<tmpQue.front();
            tmpQue.pop();
        }
        return output ;
    }
    
    QDataStream & operator>>(QDataStream & input, DataClass & obj)
    {
        input >> obj.id >>obj.name;
        while(!input.atEnd())
        {
            int elem;
            input >> elem;
            obj.que.push(elem);
        }
        return input;
    }
    
    

    MainWindow 序列化按钮点击事件:

    void MainWindow::on_pushButton_clicked()
    {
        //序列化按钮单击事件
        DataClass obj;
        obj.id = 888;
        obj.name = "tobin";
        obj.que.push(999);
        obj.que.push(888);
        obj.que.push(777);
        QFile f("D:/serialization.txt");
        if(!f.open(QIODevice::WriteOnly | QIODevice::Text))
        {
            qDebug() << "文件打开失败!" ;
            return;
        }
    
        QDataStream ds(&f);
    
        ds << obj ;
        f.close();
        qDebug()<<"序列化保存成功!";
    }

    MainWindow 反序列化 按钮点击事件:

    QFile f("D:/serialization.txt");
        if(!f.open(QIODevice::ReadOnly | QIODevice::Text))
        {
            qDebug() << "文件打开失败!" ;
            return;
        }
    
        QDataStream ds(&f);
        DataClass obj;
        while(!ds.atEnd())
        {
            ds >> obj;
        }
        qDebug()<<"反序列化完成,obj的id为"<<obj.id<<" name 为:"<<obj.name;
        queue<int>tmpQue = obj.que;
        while(!tmpQue.empty())
        {
            qDebug()<<tmpQue.front();
            tmpQue.pop();
        }
        f.close();

    运行效果:

    这里写图片描述
    这里写图片描述

    展开全文
  • I am programming a GUI with Qt library. In my GUI I have a huge std::map."MyType" is a class that has different kinds of fields.I want to serialize the std::map. How can I do that? Does Qt provides us...

    I am programming a GUI with Qt library. In my GUI I have a huge std::map.

    "MyType" is a class that has different kinds of fields.

    I want to serialize the std::map. How can I do that? Does Qt provides us with neccesary features?

    解决方案

    QDataStream handles a variety of C++ and Qt data types. The complete list is available at http://qt-project.org/doc/qt-4.8/datastreamformat.html. We can also add support for our own custom types by overloading the << and >> operators. Here's the definition of a custom data type that can be used with QDataStream:

    class Painting

    {

    public:

    Painting() { myYear = 0; }

    Painting(const QString &title, const QString &artist, int year) {

    myTitle = title;

    myArtist = artist;

    myYear = year;

    }

    void setTitle(const QString &title) { myTitle = title; }

    QString title() const { return myTitle; }

    ...

    private:

    QString myTitle;

    QString myArtist;

    int myYear;

    };

    QDataStream &operator<

    QDataStream &operator>>(QDataStream &in, Painting &painting);

    Here's how we would implement the << operator:

    QDataStream &operator<

    {

    out << painting.title() << painting.artist()

    << quint32(painting.year());

    return out;

    }

    To output a Painting, we simply output two QStrings and a quint32. At the end of the function, we return the stream. This is a common C++ idiom that allows us to use a chain of << operators with an output stream. For example:

    out << painting1 << painting2 << painting3;

    The implementation of operator>>() is similar to that of operator<

    QDataStream &operator>>(QDataStream &in, Painting &painting)

    {

    QString title;

    QString artist;

    quint32 year;

    in >> title >> artist >> year;

    painting = Painting(title, artist, year);

    return in;

    }

    This is from: C++ GUI Programming with Qt 4 By Jasmin Blanchette, Mark Summerfield

    展开全文
  • How can I know the size of qt data types in bytes; including QString objects if these data types were written on some QFile. I have to implement sizeOf() function in the Student class as below; someth...

    How can I know the size of qt data types in bytes; including QString objects if these data types were written on some QFile. I have to implement sizeOf() function in the Student class as below; something like we sizeof(struct student) in C.

    Student class

    #include

    class Student

    {

    public:

    QString name,fname;

    quint8 age,weight,clss;

    Student(){

    }

    /*the following function should return the size of this object in bytes;

    I will use QDataStream & operator<

    function to write data to a QFile */

    qint16 sizeOf()

    {

    // needs implementation;

    }

    };

    QDataStream & operator<

    {

    out<

    return out;

    }

    QDataStream & operator>>(QDataStream &in, Student &f)

    {

    in>>f.name>>f.fname>>f.age>>f.weight>>f.clss>>f.next;

    return in;

    }

    I know that data can be read with QDataStream & operator>>(QDataStream &in, Student &f); but I want to know size also for some other cases.

    This does not give me a valid size on file. It seems Qt adds some extra bits while serializing; possibly for endian-ness independency on different platforms. Actual size is always more than returned by sizeOf() function

    qint16 sizeOf()

    {

    qint16 size=0;

    size+=sizeof(quint8)*3; // size of age, weight and clss

    //variables all have type quint8

    size+=name.size()*16; // number of characters in string

    // multiply with 16 bit QChar

    size+=fname.size()*16;

    return size;

    }

    I am using QFile, QDataStream api. Qt version 4.8 on Windows 8.

    解决方案

    The size which sizeof will give you does not reflect the actual size an object might have. For example, the sizeof a QString in a 32 bit build will always be 4 bites, regardless how long the actual string is.

    This sizeof operator includes stuff that doesn't need to be serialized, like the object's vtable pointer, and does not account for the size of dynamically allocated resources for that object.

    You can easily determine the serializable size, just use a QDataStream, from the device() get the pos() before, input the object in the data stream and compare with the pos() afterwards.

    Also, this line is clearly wrong: size+=sizeof(quint8*3) it will not give you three times the size of a byte. It will give you the size of an int, which is how the result is promoted after the multiplication.

    Here is a nifty little class you can use for the task:

    class SerialSize {

    public:

    SerialSize() : stream(&data) { data.open(QIODevice::WriteOnly); }

    template

    quint64 operator ()(const T & t) {

    data.seek(0);

    stream << t;

    return data.pos();

    }

    private:

    QBuffer data;

    QDataStream stream;

    };

    Then use it:

    SerialSize size;

    qDebug() << size(QString("a")); // 6

    qDebug() << size(QString("aa")); // 8

    展开全文
  • Qt对象序列化的实现

    千次阅读 2016-01-04 19:45:39
    参考资料 [1]Qt持久性对象进行序列化 [2]Qt中序列化对象 [3]对象的序列化和反序列化 [4]JAVA对象序列化保存为XML文件的工具类

    1 基本概念

        根据参考资料[3]的说明,把对象转换为字节序列的过程称为对象的序列化;把字节序列恢复为对象的过程称为对象的反序列化

    2 对象实例化实例

        根据参考资料[1]的说明,Qt中实现对象序列化的类是QDataStream,下面是Qt帮助文档中的两个用例:

    2.1 Example (write binary data to a stream)

    QFile file("file.dat");
    file.open(QIODevice::WriteOnly);
    QDataStream out(&file);   // we will serialize the data into the file
    out << QString("the answer is");   // serialize a string
    out << (qint32)42;        // serialize an integer

    2.2 Example (read binary data from a stream)

    QFile file("file.dat");
    file.open(QIODevice::ReadOnly);
    QDataStream in(&file);    // read the data serialized from the file
    QString str;
    qint32 a;
    in >> str >> a;           // extract "the answer is" and 42

    3 自定义类的对象实例化

        根据参考资料[2]的说明,但QDataStream类只能序列化基本类型和一部分Qt定义的类,对于自定义类需要自己编写序列化函数。主要就是实现<<>>的重载,具体可以参见QPoint源码的实现,或者参考资料[1]。

        需要注意的是,参考资料[1]中提到,需要序列化的类要继承于QObject,经过测试发现,这是不需要的(事实上QPoint就没有继承于QObject)。

        另外,参考资料[1]中提到,需要将<<和>>的重载函数定义为需要序列化的类的友函数,其实这不是必需的(QPoint的<<和>>重载函数就没有声明为QPoint的友函数);然而,如果想要在<<或者>>重载函数中直接访问类的私有成员,那就有必要将<<和>>的重载函数定义为友函数了。

    参考资料

    [1]Qt持久性对象进行序列化

    [2]Qt中序列化对象

    [3]对象的序列化和反序列化

    [4]JAVA对象序列化保存为XML文件的工具类

    展开全文
  • Qt序列化自定义对象

    千次阅读 2014-09-29 15:03:13
    Qt序列化数据的类是QDataStream,但这个类只能序列化基本类型和一部分Qt定义的类,对于自定义类需要自己编写序列化函数。 在自定义类中声明友元函数,并实现: class CKDrawBase: { public:   friend ...
  • Qt序列化对象

    千次阅读 2016-06-08 15:30:45
    转自:... Qt序列化数据的类是QDataStream,但这个类只能序列化基本类型和一部分Qt定义的类,对于自定义类需要自己编写序列化函数。 在自定义类中声明友元函数,并实现: class CKDrawB
  • Qt 序列化对象

    千次阅读 2013-08-30 09:48:13
    Qt序列化数据用的类是QDataStream,但这个类只能序列化基本类型和一部分Qt定义的类,对于自定义类需要自己编写序列化函数。 在自定义类中声明友元函数,并实现: class CKDrawBase: { public:   friend ...
  • 可能就需要用到两种方式来解析传输数据,对应数据格式的字节位来解析,或者是采用数据序列化与反序列化的方式来解析。个人比较倾向于后者的方式,毕竟以前做过Java或C#的项目。也觉得用这种方式比较方便省事。所以就...
  • Qt序列化和反序列化

    千次阅读 2019-05-15 15:10:42
    定义: ...Qt中实现对象序列化的类是QDataStream,写二进制到流中 QFile file("file.dat"); //创建一个文档 file.open(QIODevice::WriteOnly);//打开并只写 QDataStream out(&file); //序列...
  • Qt - 序列化之JSON

    2021-04-06 20:22:26
    文章目录Qt-Json相关类QJsonDocumentQJsonObjectQJsonArrayQJsonValueQJsonParseError构建json对象生成js文档json 解析 Qt-Json相关类 QJsonDocument QJsonDocument 类常用于读和写 JSON文档,这里的JSON文档可以是 ...
  • Mfc和Java中自定义类的对象都可以对其进行持久性保存,Qt持久性对象进行序列化当然也是必不可少的。不过这个问题还真困扰了我很长时间……Mfc通过重写虚函数Serialize()、Java则是所属的类必须实现java.io....
  • Qt下实现序列化与反序列化

    千次阅读 2018-12-18 14:22:31
    写了一个工具类MyDatastream,使用时需要实例化对象,调用相应的序列化或反序列化函数即可,读者可以根据自己定制的结构体自行扩展。例子中的结构体如下: struct UserInfo { unsigned char id[20]; int idint; ...
  • 定义: ...Qt中实现对象序列化的类是QDataStream,写二进制到流中 QFile fileout("file.dat"); //创建一个文档 fileout.open(QIODevice::WriteOnly | QIODevice::Text);//打开并只写 QDataSt...
  • 介绍对象和数据的序列化与反序列化序列化序列化 数组 JSON.stringify([1, 2, 3]) JSON.parse("[1, 2, 3]") 对象 JSON.stringify({a: 1}) JSON.parse("{\“a\”: 1}") ...
  • 定义 序列化:将对象或数据结构转换为二进制序列 ...Qt中使用QDataStream类实现对象序列化; 序列化: QFile file("file.rx"); //定义文件路径 file.open(QIODevice::WriteOnly); //以只写模式打开 Q
  • QT序列化与网络传输

    2020-11-22 21:53:15
    介绍QT序列化与网络传输之间的关系!
  • MFC和Java中自定义类的对象都可以对其进行持久性保存,Qt持久性对象进行序列化当然也是必不可少的。 不过这个问题还真困扰了我很长时间…… Mfc通过重写虚函数Serialize()、Java则是所属的类必须实现java.io....
  • Qt序列化数据

    2020-08-15 18:25:46
    Qt提供的QDataStream可以序列化一些数据,如下: bool, float, double, const char * qint8, qint16, qint32, qint64, quint8, quint16, quint32, quint64 QString, QTime, QTransform, QUrl, QVariant QBitArray, ...
  • Qt序列化数据的类是QDataStream,但这个类只能序列化基本类型和一部分Qt定义的类,对于自定义类需要自己编写序列化函数。 在自定义类中声明友元函数,并实现: class CKDrawBase: { public:   friend ...
  • 对象转换为有序字节流,以便在网络上传输或者保存在本地文件中,之后根据字节流中保存的对象状态及描述信息,通过反序列化重建对象,反序列化之后的对象状态跟序列化之前的对象状态一致。 写QDataStream 遇到的问题...
  • Qt 序列化操作

    千次阅读 2015-09-10 10:13:43
    关于文件版本控制的具体实现方案会在开发完善后列出,这里仅仅指出它的保存方式,即将文件操作的实例对象序列化后保存在文件中。 序列化的实现:  这里我们采用QDataStream来实现序列化,QT针对不同的...
  • Q 在处理 Qt 数据序列化时,QJsonSerializer 是一个很好的工具。QJsonSerializer 支持所有基本类型、数组链表、QObject 属性以及 Q_GARGET 属性。 但是用 QJsonSerializer 完成序列化的工作,可能会遇到一些不容易...
  • Qt 持久性序列化

    2017-12-09 18:34:19
    对象转换为字节序列的过程称为对象序列化; 把字节序列恢复为对象的过程称为对象的反序列化。 使用友元函数 friend QDataStream& operator>> (QDataStream &in, CTest& data);  friend QDataStream& ...
  • gbk:中文占用2个字节,英文占用1个字节 ...1.对象序列化,就是将Object转换成byte序列,反之叫对象的反序列化 2.序列化流(OjectOutputStream)是过滤流----writeObject 反序列化流(ObjectInputStr...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,960
精华内容 3,184
关键字:

qt对象序列化