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 Offline
    SGaistS Offline
    SGaist
    Lifetime Qt Champion
    wrote on last edited by
    #7

    Remove MyClass;:: from the declaration.

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

    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
    3
    • 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