Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. Serialization Example
Qt 6.11 is out! See what's new in the release blog

Serialization Example

Scheduled Pinned Locked Moved Solved General and Desktop
17 Posts 3 Posters 5.9k Views 2 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • SGaistS SGaist

    Remove MyClass;:: from the declaration.

    It's shown in the Reading And Writing Other Qt Classes part of QDataStream's documentation.

    O Offline
    O Offline
    ofmrew
    wrote on last edited by
    #8

    @SGaist Did the "http://www.bogotobogo.com/Qt/Qt5_QFile_Serialization_Class.php" ever work? That is the only example I could find to use as a model.

    QDataStream &operator <<(QDataStream &out, MyClass &mc);

    Compiles, but do I need to put the implementation in the cpp file? If so, what is the format?

    1 Reply Last reply
    0
    • SGaistS Offline
      SGaistS Offline
      SGaist
      Lifetime Qt Champion
      wrote on last edited by
      #9

      Copy the methods as they are in the implementation file and just leave the declaration in the header.

      Interested in AI ? www.idiap.ch
      Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

      O 1 Reply Last reply
      2
      • SGaistS SGaist

        Copy the methods as they are in the implementation file and just leave the declaration in the header.

        O Offline
        O Offline
        ofmrew
        wrote on last edited by
        #10

        @SGaist That compiled. Not to testing. Thanks.

        O 1 Reply Last reply
        0
        • O ofmrew

          @SGaist That compiled. Not to testing. Thanks.

          O Offline
          O Offline
          ofmrew
          wrote on last edited by
          #11

          @ofmrew The status after the write to datastream is 0, but the >> does not appear to work. I added MyClass to a vector and tried to serialize it, but it failed to return the vector from the stream. A breakpoint, in MyClass, on << is activated, but one on >> is not.

          class MyCanvas : public QWidget
          {
              Q_OBJECT
          public:
              explicit MyCanvas(QWidget *parent = nullptr);
          
              void create();
              void store();
              void load();
          
              QVector<MyClass> cell;
              QDataStream stream;
          
          
          MyCanvas::MyCanvas(QWidget *parent) : QWidget(parent)
          {
          
          }
          
          void MyCanvas::create()
          {
          //    QVector<MyClass>cell;
          
              MyClass line1(QRectF(50.0, 50.0, 200.0, 200.0), QLineF(50.0, 50.0, 250.0, 250.0));
              cell.append(line1);
              MyClass line2(QRectF(250.0, 50.0, 200.0, 200.0), QLineF(250.0, 250.0, 500.0, 50.0));
              cell.append(line2);
          }
          
          void MyCanvas::store()
          {
          //    stream = new QDataStream();
              stream<<cell;
              qDebug() << "status" << stream.status();
          //    qDebug() << stream;
          }
          
          void MyCanvas::load()
          {
          //    cell2 = new QVector<MyClass>();
              cell.clear();
              stream>>cell;
              qDebug() << cell.size();
          //    qDebug() << cell;
          }
          class MyClass
          {
          public:
              explicit MyClass();
              MyClass(QRectF r, QLineF l);
              void addBoundingRect(QRectF);
              void addLine(QLineF);
          
          
              QRectF br;
              QLineF ln;
          
          signals:
          
          public slots:
          };
          QDataStream &operator <<(QDataStream &out, const MyClass &mc);
          QDataStream &operator >>(QDataStream &in, MyClass &mc);
          
          MyClass::MyClass() {}
          MyClass::MyClass(QRectF r, QLineF l) : br{r}, ln{l}
          {
          
          }
          
          void MyClass::addBoundingRect(QRectF r)
          {
              br = r;
          }
          QDataStream &operator <<(QDataStream &out, const MyClass &mc){
              out << mc.br << mc.ln;
              return out;
          
          }
          QDataStream &operator >>(QDataStream &in, MyClass &mc){
              in >> mc.br >> mc.ln;
              return in;
          }
          
          ```Is it failing to create MyClass?
          O 1 Reply Last reply
          0
          • O ofmrew

            @ofmrew The status after the write to datastream is 0, but the >> does not appear to work. I added MyClass to a vector and tried to serialize it, but it failed to return the vector from the stream. A breakpoint, in MyClass, on << is activated, but one on >> is not.

            class MyCanvas : public QWidget
            {
                Q_OBJECT
            public:
                explicit MyCanvas(QWidget *parent = nullptr);
            
                void create();
                void store();
                void load();
            
                QVector<MyClass> cell;
                QDataStream stream;
            
            
            MyCanvas::MyCanvas(QWidget *parent) : QWidget(parent)
            {
            
            }
            
            void MyCanvas::create()
            {
            //    QVector<MyClass>cell;
            
                MyClass line1(QRectF(50.0, 50.0, 200.0, 200.0), QLineF(50.0, 50.0, 250.0, 250.0));
                cell.append(line1);
                MyClass line2(QRectF(250.0, 50.0, 200.0, 200.0), QLineF(250.0, 250.0, 500.0, 50.0));
                cell.append(line2);
            }
            
            void MyCanvas::store()
            {
            //    stream = new QDataStream();
                stream<<cell;
                qDebug() << "status" << stream.status();
            //    qDebug() << stream;
            }
            
            void MyCanvas::load()
            {
            //    cell2 = new QVector<MyClass>();
                cell.clear();
                stream>>cell;
                qDebug() << cell.size();
            //    qDebug() << cell;
            }
            class MyClass
            {
            public:
                explicit MyClass();
                MyClass(QRectF r, QLineF l);
                void addBoundingRect(QRectF);
                void addLine(QLineF);
            
            
                QRectF br;
                QLineF ln;
            
            signals:
            
            public slots:
            };
            QDataStream &operator <<(QDataStream &out, const MyClass &mc);
            QDataStream &operator >>(QDataStream &in, MyClass &mc);
            
            MyClass::MyClass() {}
            MyClass::MyClass(QRectF r, QLineF l) : br{r}, ln{l}
            {
            
            }
            
            void MyClass::addBoundingRect(QRectF r)
            {
                br = r;
            }
            QDataStream &operator <<(QDataStream &out, const MyClass &mc){
                out << mc.br << mc.ln;
                return out;
            
            }
            QDataStream &operator >>(QDataStream &in, MyClass &mc){
                in >> mc.br >> mc.ln;
                return in;
            }
            
            ```Is it failing to create MyClass?
            O Offline
            O Offline
            ofmrew
            wrote on last edited by
            #12

            @ofmrew Ignore the last post: Like an idiot I missed the fact that QDataStream is a file. Thanks for the help.

            O 1 Reply Last reply
            0
            • O ofmrew

              @ofmrew Ignore the last post: Like an idiot I missed the fact that QDataStream is a file. Thanks for the help.

              O Offline
              O Offline
              ofmrew
              wrote on last edited by
              #13

              @ofmrew I tested the serialization both out and in. Now I am trying to serialize QMap<int, QVector<PixmapTile>> levelMap;. The out seemed to work, but on in it is having a problem with QVector<PixmapTile>.

              /home/xxx/Qt/5.10.0/gcc_64/include/QtCore/qdatastream.h:242: error: no match for ‘operator>>’ (operand types are ‘QDataStream’ and ‘QVector<PixmapTile>::value_type {aka PixmapTile}’)
                       s >> t;
               QDataStream &operator<<(QDataStream &s, const PixmapTile &pixmt);
              QDataStream &operator<<(QDataStream &s, PixmapTile &pixmt);
              QDataStream &operator<<(QDataStream &s, QVector<PixmapTile> &vofpt);
              

              Am I asking too much?

              1 Reply Last reply
              0
              • SGaistS Offline
                SGaistS Offline
                SGaist
                Lifetime Qt Champion
                wrote on last edited by
                #14

                IIRC, you don't need to implement the QVector version because it should be automatically handled as you implemented the operators for your custom data type.

                There might be a typo you only have operator<< declared in your last code sample.

                Interested in AI ? www.idiap.ch
                Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                O 1 Reply Last reply
                0
                • SGaistS SGaist

                  IIRC, you don't need to implement the QVector version because it should be automatically handled as you implemented the operators for your custom data type.

                  There might be a typo you only have operator<< declared in your last code sample.

                  O Offline
                  O Offline
                  ofmrew
                  wrote on last edited by
                  #15

                  @SGaist Good eyes.

                  QDataStream &operator>>(QDataStream &s, PixmapTile &pixmt);
                  //QDataStream &operator<<(QDataStream &s, QVector<PixmapTile> &vofpt);
                  

                  Got it to compile. Copy and paste can bit you. Thanks.

                  O VRoninV 2 Replies Last reply
                  0
                  • O ofmrew

                    @SGaist Good eyes.

                    QDataStream &operator>>(QDataStream &s, PixmapTile &pixmt);
                    //QDataStream &operator<<(QDataStream &s, QVector<PixmapTile> &vofpt);
                    

                    Got it to compile. Copy and paste can bit you. Thanks.

                    O Offline
                    O Offline
                    ofmrew
                    wrote on last edited by
                    #16

                    @ofmrew I checked it with the debugger and it looks good. I am impressed.

                    1 Reply Last reply
                    0
                    • O ofmrew

                      @SGaist Good eyes.

                      QDataStream &operator>>(QDataStream &s, PixmapTile &pixmt);
                      //QDataStream &operator<<(QDataStream &s, QVector<PixmapTile> &vofpt);
                      

                      Got it to compile. Copy and paste can bit you. Thanks.

                      VRoninV Offline
                      VRoninV Offline
                      VRonin
                      wrote on last edited by
                      #17

                      @ofmrew said in Serialization Example:

                      QDataStream &operator<<(QDataStream &s, QVector<PixmapTile> &vofpt);

                      As mentioned by @SGaist you don't need to implement the operator for QVector<PixmapTile>. Qt already has template operators for QMap and QVector you just need to implement QDataStream &operator>>(QDataStream &s, PixmapTile &pixmt); and QDataStream &operator<<(QDataStream &s, const PixmapTile &pixmt);. the rest is for free

                      "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
                      ~Napoleon Bonaparte

                      On a crusade to banish setIndexWidget() from the holy land of Qt

                      1 Reply Last reply
                      0

                      • Login

                      • Login or register to search.
                      • First post
                        Last post
                      0
                      • Categories
                      • Recent
                      • Tags
                      • Popular
                      • Users
                      • Groups
                      • Search
                      • Get Qt Extensions
                      • Unsolved