c++ qt serialization qobject

c++ - Serializando mi clase personalizada en Qt



serialization qobject (1)

Debe hacer id y Name como Q_PROPERTY para manejarlo con el sistema de propiedad metaObject:

class student : public Base { Q_OBJECT // Q_OBJECT macro will take care of generating proper metaObject for your class Q_PROPERTY(int id READ getId WRITE setId) Q_PROPERTY(QString Name READ getName WRITE setName) public: student(); int getId() const { return id; } void setId(int newId) { id = newId; } QString getName() const { return Name; } void setName(const QString &newName) { Name = newName; } private: int id; QString Name; };

Ahora las propiedades deberían manejarse de la manera adecuada.

Consulte http://doc.qt.io/qt-5/properties.html para obtener información detallada.

yo uso Leer / escribir QObjects ¿ es verdad? serializo una clase con él, pero cuando deserializo, ¡no es la clase original!

¿que puedo hacer?

este es mi encabezado de clase base:

class Base : public QObject { Q_OBJECT public: explicit Base(QObject *parent = 0); }; QDataStream &operator<<(QDataStream &ds, const Base &obj); QDataStream &operator>>(QDataStream &ds, Base &obj) ;

y .cpp es:

Base::Base(QObject *parent) : QObject(parent) { } QDataStream &operator<<(QDataStream &ds, const Base &obj) { for(int i=0; i<obj.metaObject()->propertyCount(); ++i) { if(obj.metaObject()->property(i).isStored(&obj)) { ds << obj.metaObject()->property(i).read(&obj); } } return ds; } QDataStream &operator>>(QDataStream &ds, Base &obj) { QVariant var; for(int i=0; i<obj.metaObject()->propertyCount(); ++i) { if(obj.metaObject()->property(i).isStored(&obj)) { ds >> var; obj.metaObject()->property(i).write(&obj, var); } } return ds; }

y tengo una clase de estudiante que hereda de la base:

class student : public Base { public: student(); int id; QString Name; };

y es mi principal:

int main(int argc, char *argv[]) { QApplication a(argc, argv); Widget w; w.show(); student G; student G2; G.id=30; G.Name="erfan"; qDebug()<<G.id<<G.Name; QFile file("file.dat"); file.open(QIODevice::WriteOnly); QDataStream out(&file); // we will serialize the data into the file out <<G; qDebug()<<G2.id<<G2.Name; file.close(); file.open(QIODevice::ReadOnly); out>>G2; qDebug()<<G2.id<<G2.Name; return a.exec(); }

y es mi resultado:

30 "erfan" 1498018562 "" 1498018562 ""