Сериализация QHash с собственным классом?

у меня есть QHash<const QString id, MyClass> тогда как MyClass — это просто набор некоторых значений QString quint8 с геттерами и сеттерами. MyClass также имеет QDataStream &operator<<(QDataStream &ds, const MyClass &obj) перезаписано, там.

Для сериализации я использую:

typedef QHash<const QString, MyClass> MyClassHash;
//..
QDataStream &operator<<(QDataStream &ds, const MyClassHash &obj) {

QHashIterator<const QString, MyClass> i(obj);

while(i.hasNext())
{
i.next();
QString cKey = i.key();
ds << cKey << i.value();
}

return ds;
}

Теперь меня смущают другие:

QDataStream &operator>>(QDataStream &ds, MyClassHash &obj) {
obj.clear();

// ?

return ds;
}

Я бы знал длину этого сериализованного QHash?

0

Решение

Что насчет QDataStream :: статус :

QDataStream &operator>>(QDataStream &ds, MyClassHash &obj) {
obj.clear(); // clear possible items

Myclass cMyCls;

while (!ds.status()) { // while not finished or corrupted
ds >> cKey >> cMyCls;
if (!cKey.isEmpty()) { // prohibits the last empty one
obj.insert(cKey, cMyCls);
}
}

return ds;
}
1

Другие решения

Вы не делайте предоставлять operator<< а также operator>> для QHash; их реализация уже предоставлена ​​вам Qt.

Пока ваш тип ключа и тип значения сериализуемы с использованием QDataStream, тогда все готово:

class MyClass
{
int i;
friend QDataStream &operator<<(QDataStream &ds, const MyClass &c);
friend QDataStream &operator>>(QDataStream &ds, MyClass &c);
};

QDataStream &operator<<(QDataStream &ds, const MyClass &c)
{
ds << c.i;
return ds;
}
QDataStream &operator>>(QDataStream &ds, MyClass &c)
{
ds >> c.i;
return ds;
}

int main()
{
QHash<QString, MyClass> hash;
QDataStream ds;
// doesn't do anything useful, but it compiles, showing you
// that you don't need any custom streaming operators
// for QHash
ds << hash;
ds >> hash;
}
1

Очевидно, есть два способа сделать что-то:

  1. В operator<< перед сохранением элементов QHash следует сохранить QHash :: size
  2. В конце operator<< сохранить недопустимую QString, например пустую QString, и в operator>>прекрати читать, когда мы встретим такую ​​ценность.
0
По вопросам рекламы [email protected]