2011-09-14 151 views
0

這2個函數是我嘗試序列化一個QVector。不幸的是我不能使用QDataStream,因爲我的老闆要求實現獨立於Qt,並且QDataStream要預先設置一個頭。所以問題是由函數返回的矢量binToVector返回一個等於0的大小,但是如果元素被打印出來,它們就等於原始矢量。爲什麼返回的大小是零,如果矢量的元素等於原始的?這些序列化功能可以嗎?我無法使用boost,也沒有Qt函數來實現它,只有C++;QVector大小()返回大小爲零

QByteArray vectorToBin(const QVector<qint32> & vec) 
{ 
    QByteArray result; 
    foreach(quint32 e, vec) { 
    char *src = reinterpret_cast<char*>(&e); 
    result.append(src, sizeof(qint32)); 
    } 
    return result; 
} 

QVector<qint32> binToVector(const QByteArray & bytes) 
{ 
    int size = sizeof(qint32); 
    QVector<qint32> result; 
    result.reserve(bytes.count()/size); 
    int j=0; 
    for(int i=0; i<bytes.count(); i+=size) { 
    memcpy(&result[j++], bytes.constData()+i, size); 
    } 
    return result; 
} 
+0

你的老闆想要......序列化QT數據結構......不使用QT? – Puppy

+0

你已經在使用QVector,所以你的實現不能獨立於Qt。如果它的頭問題,然後嘗試前向聲明。編寫什麼QDataStream基本上是重新發明輪子。問你的老闆他是否會重新發明輪子:)) – blueskin

+1

這種@DeadMG。他希望序列化*發生*的數據以存儲在項目當前化身中的Qt數據結構中。他不希望被綁定到Qt的序列化格式,因爲他們有一天決定使用某個特定的Qt類以外的東西,或者他們希望其他非Qt使用的項目能夠使用相同的序列化數據。 –

回答

6

你打電話QVector::reserve,其中分配內存的類作爲存儲使用,但實際上並沒有改變的容器真正元件的數量。爲此,您需要QVector::resize。標準C++ vector類的工作方式相同。提前預留空間可確保重複未來呼叫append不必一直重新分配容器的存儲空間。

+0

賓果!感謝你的回答。 –