2014-09-02 417 views
1

我需要將QVariantMap作爲QByteArray序列化,而且似乎正確的方法是通過QDataStream。不過,我這樣做很麻煩。我沒有收到任何錯誤,但實際上並沒有將任何內容保存到字節數組中。使用QDataStream將QVariantMap序列化爲QByteArray

//Create a QVariantMap that has a key value pair 
QVariantMap *myMap = new QVariantMap(); 
myMap->insert("MyKey","the value for MyKey"); 

// Serialize it to a QBiteArray using a QDataStream object 
QByteArray byteArray; 
QDataStream stream(&byteArray, QIODevice::WriteOnly); 
//qDebug() << byteArray.toHex(); ==> "" (because byteArray is empty) 
stream << myMap; 
//qDebug() << byteArray.toHex(); ==> "01" (regardless of what the key/value/etc. was, it's always 01) 
//Test whether I can read it out 
QVariantMap inMap; 
QDataStream inStream(&byteArray, QIODevice::ReadOnly); 
instream >> inMap; 
//qDebug() << inMap.keys(); ==>() (No keys are in the map) 

所以沒有任何錯誤或明顯地失敗,但它仍然無法居然把任何值(除了01 - 大小?)入的ByteArray。我在這個主題上嘗試了一些變體,沒有任何變體(除了只是導致錯誤的變體)。

我做的唯一有所作爲的是多個「流< < myMap」行,例如,如果我重複該行三次,則將byteArray設置爲「010101」。所以我每次運行「流< < myMap」時,我都會再得到一個「01」。

我擔心我可能剛剛有不正確的讀取代碼,並且寫入很好,這就是爲什麼我添加了檢查十六進制代碼的調試行,並且明確指出存在寫入錯誤。

回答

2

代碼有錯誤。您發送給您的byteArray的內容不是QVariantMap,它是指向QVariantMap的指針。這只是發送一個地址到數組而不是地圖數據。這個變化stream << (*myMap);應該爲你工作。

繼工作示例:

QVariantMap myMap, inMap; 
QByteArray mapData; 

myMap.insert("Hello", 25); 
myMap.insert("World", 20); 

QDataStream outStream(&mapData, QIODevice::WriteOnly); 
outStream << myMap; 
qDebug() << myMap; 
QDataStream inStream(&mapData, QIODevice::ReadOnly); 
inStream >> inMap; 
qDebug() << inMap; 

輸出

QMap(("Hello", QVariant(int, 25)) ("World" , QVariant(int, 20))) 
QMap(("Hello", QVariant(int, 25)) ("World" , QVariant(int, 20))) 

請注意,我已經刪除了指針在我的實現。我確實希望儘可能使用範圍變量,並建議您這樣做。這是一種獲取和釋放資源的簡單方法,可以幫助您免受破壞的危害。