buffer deserialize problem.



  • Hi alle :-). Ich habe da ein Problem beim deserialisieren von objekten.

    Ich bekomme übers internet via socket (tcpip) einen bytebuffer.
    In diesem stecken xAnzahl beliebige objekte zum deserialisieren.
    Jetzt habe ich die Möglichkeit mit CArchive::IsBufferEmpty() zu prüfen ob es im archivepuffer noch was zum deserialisieren gibt.
    Allerdings is der Rest im achive nicht immer ein komplettes Objekt und ich bekomme eine Exception (badClass).

    Kennt jemand vieleicht einen weg wie ich das hier lösen kann ohne die exception abzufangen, über umwege auf den restlichen buffer zu kommen und diesen dann an den anfang des naechsten buffers den ich übers internet bekomme zu hängen?

    mfg,
    Mike



  • Merk dir die Position des ersten nicht-serialisierten Objekts - wenn ende-pos>sizeof(object) ist, hast du dort noch ein komplettes Object liegen.


  • Mod

    Man bekommt das nur über ein entsprechendes Protokoll hin.
    Das einfachste wäre, dass Du die abschnittsweise Deine Daten in Blöcke packst und diee Blöcke dann Paket für Paket ausgibst. Jeder Block bekommt vorne weg seine Größe gesendet. Immer wenn ein Block angekommen ist deserialisierst Du die Daten.

    @CStoll: Das Problem ist, dass die Größe des Objektes im Stream mit dem im Memory oft nichts zu tun hat.



  • Martin Richter schrieb:

    @CStoll: Das Problem ist, dass die Größe des Objektes im Stream mit dem im Memory oft nichts zu tun hat.

    In dem Fall mußt du sowieso die echte Objektgröße mit übertragen - und dann kannst du auch mit diesem Wert vergleichen


  • Mod

    CStoll schrieb:

    Martin Richter schrieb:

    @CStoll: Das Problem ist, dass die Größe des Objektes im Stream mit dem im Memory oft nichts zu tun hat.

    In dem Fall mußt du sowieso die echte Objektgröße mit übertragen - und dann kannst du auch mit diesem Wert vergleichen

    Schwierig, wie meinst Du das? Ich vermute er verwendet die MFC.
    Wenn ein Object der MFC mehrere andere Objekt mit serialisiert, dann weiß man das doch am Anfang gar nicht wie groß das eigentliche Objekt wird.
    Man müsste also erstmal serialisieren in einem CMemoryFile und dann den Block rausschieben und die Größe dieses Streams dann an den Anfang setzen. So meinte ich es. Du auch? 🙂



  • hi boys!

    also im moment löse ich das ganze so..

    ich bekomme im schlimmstenfall meinen buffer komplett gefüllt.
    Ich desserialisier nun solange bis ich mit CArchive eine exeption bekomme, dass die restlichen bytes nich ausreichen fuer das deserialisieren.

    Bis dahin hab ich schon gezählt wieviel byte ich aus dem memfile(buffer is ans memfile attached etc.) ausgelesen habe.

    dann nehm ich mir den restlichen bytebuffer und stecke ihn am anfange des naechsten buffers den ich über den stack bekomme und deserialisier wieder...

    ich finde das aber nicht so eine tolle lösung. kommt mir zu sehr nach basteln vor.

    cheers,
    mike


Anmelden zum Antworten