Probleme beim Deserialisieren
-
Hallo,
aus einem File lese ich mit einem ifstream Daten aus. Der Inhalt des ifstreams soll dann wieder zu einem Objekt zusammen gefügt werden, also der Inhalt des streams auf die verschiedenen Variablen meines Objekts aufgeteilt werden. Das Problem ist nur, dass es sich um ein komplexes Objekt handelt. Die Zuweisung der der Werte zu den Variablen funktioniert nur bis zu dem Punkt, bis ich den stream (als Referenz) an ein neues Objekt übergebe, dass Bestandteil des alten Objekts ist. Ich verstehe das nicht, ich dachte, wenn man eine Referenz übergibt, dann arbeitet man auf dem Original. Aber der stream ist im neuen Objekt einfach leer.
Zur genaueren Erklärung: Ich habe eine Klasse Object mit einer Funktion deserialize(ifstream & ). Object besteht aus weiteren Objekten, die ebenfalls die Funktion deserialize implementieren und denen der ifstream auch als Referenz weitergegeben wird. Das geht dann so lange bis ich auf die primitiven Datentypen stoße. Hab ich irgendeinen Denkfehler drin.Danke für eure Hilfe,
Isa
-
Vom Prinzip her hast du alles richtig gemacht, am besten du postest mal etwas Code...
-
Hallo Th,
ich hab inzwischen herausgefunden, dass es nichts mit dem Stream zu tun. Aber es wird falsch ausgelesen. In meinem Stream ist folgende Datenreihe: 3-842150451-842150451-8421504518282808000720000010229214.53815e-0052.16005e-0120-6.27744e+066
Die ersten drei Integer werden auch ausgelesen also int i = 3, int j = -842150451 (nicht wundern ist ein uninitialisierter Integer, das stimmt schon) usw. immer bis zum Minuszeichen. Der vierte (auch ein Integer) wird aber bis zum ersten Punkt ausgelesen. Und dann wird der stream an das nächste Objekt übergeben und das soll seine primitiven Datentypen auslesen. Aber das geht natürlich nicht mehr bzw. die Werte sind nicht korrekt. Ich lese die Integer immer so aus:int i = 0; streamIn >> i;Hab ich da beim Schreiben auf das File schon irgendeinen Fehler gemacht? Es wird nämlich als char* geschrieben.
Danke für deine Hilfe,
Isa
-
Wenn du Zahlen im Klartext (also nicht binaer) in eine Datei schreibst solltest du auch ein Trennzeichen mit einplanen. Woher soll ifstream sonst gesichert wissen, wo die Zahl zu Ende ist?
3-842150451-842150451-84215045182828/*hier kann auch schon eine Zahl zu ende sein*/08000/*oder hier*/7200/*hier ist noch eine*/00010229214.53815e-0052.16005e-0120-6.27744e+066
Alternativ kannst du natuerlich auch eine bestimmte Zahl Stellen festlegen, die bei jeder Zahl geschrieben werden (und ggf vor zuvor Nullen aufgefuellt), halte ich aber fuer nicht sehr sinnvoll.
Also entweder Trennzeichen einfuegen oder binaer speichern.Gruss,
DeSoVoDaMu
-
Hmmm, okay und wie speichert man binär? Das Problem ist, dass die Objekte serialisiert über TCP/IP verschickt werden, aber in QT. Das dumme ist, dass meine Applikation so vorgesehen ist, dass die Netzwerkverbindung über Qt läuft und die Deserialisierung dann in reinem C++-Code laufen soll.
Das ganze sieht dann so aus
[code]
QDataStream in(tcpSocket);
blockSize = 0;
in.setVersion(QDataStream::Qt_4_0);if (blockSize == 0)
{
if (tcpSocket->bytesAvailable() < (int)sizeof(quint16))
return;
in >> blockSize;
}
if (tcpSocket->bytesAvailable() < blockSize)
return;char * chTmp;
in >> chTmp;
-
Aaaah, tut mir leid, auf die Versenden-Taste gekommen. Also nochmal
QDataStream in(tcpSocket); blockSize = 0; in.setVersion(QDataStream::Qt_4_0); if (blockSize == 0) { if (tcpSocket->bytesAvailable() < (int)sizeof(quint16)) return; in >> blockSize; } if (tcpSocket->bytesAvailable() < blockSize) return; char * chTmp; in >> chTmp; QByteArray qbaIn = QByteArray(chTmp); QFile fileIn("navrecordstream.ros"); if(!fileIn.open(QIODevice::WriteOnly)) return; nBytesWritten = fileIn.write(qbaIn); fileIn.close(); streamIn.open("navrecordstream.ros", ios::binary); //deserialisiern mit streamIn streamIn.close();Ich nehme an, dass es daran liegt, dass ich den QDataStream mit einem char* auslese. Aber nachdem das hier ja ein C++-Forum ist, sollte ich die Frage vermutlich eher in einem QT-Forum stellen. Außer natürlich jemand kennt sich damit aus.
Grüße,
Isa