我有一个QHash<const QString id, MyClass>
,而MyClass只是一些带有getter和setter的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 :(得分:1)
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 :(得分:1)
您不为QHash提供operator<<
和operator>>
; 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;
}
答案 2 :(得分:0)
显然,有两种方法可以做:
operator<<
中,您应该保存QHash :: size operator<<
结尾处保存一些无效的QString,例如空的QString,在operator>>
中,当我们遇到这样的值时停止阅读。