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
Forum Updated to NodeBB v4.3 + New Features

Serialization Example

Scheduled Pinned Locked Moved Solved General and Desktop
17 Posts 3 Posters 4.1k 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