CArchive macht komische Sachen....



  • Hi! Wie kann sowas kommen? Im debug mode fülle ich das ObjectArray nicht mit Objekten und alles geht. Aber der Release Mode benötigt in er Liste min. ein Objekt vom selben Typ das später hinein geschrieben werden soll. Kann man diesen Fehler auch anders beheben als vorher ein Objekt in die Liste zu packen? Warum gehts im Debug Mode?

    code:

    Debugger:

    CObArray obA;
    CSocketFile cIntSockFile(&echoClient, 1);
    CArchive ar(&cIntSockFile, CArchive::load);
    obA.Serialize(ar);  
    CString h = ((MeineKlasse*)obA.GetAt(0))->getName();
    

    Release:

    CObArray obA;
    MeineKlasse opt;    
    obA.Add(&opt);
    CSocketFile cIntSockFile(&echoClient, 1);
    CArchive ar(&cIntSockFile, CArchive::load);
    obA.Serialize(ar);  
    CString h = ((MeineKlasse*)obA.GetAt(0))->getName();
    

    danke schonmal
    MfG
    ExElNeT



  • Kannst Du mir mal den Sinn dieser Codeabschnitte erklären, mal abgesehen davon, dass Du Funktionen einfach zweckentfremdest!

    MSDN:

    Serialize is called by CArchive::ReadObject and CArchive::WriteObject.



  • Zweckentfremden? CArchiv wird verwendet um Serialisierte Objekte über Sockets per Tcp/Ip zu verschicken. Da ist nix zweckentfremdet.

    In diesem Artikel wird das CSocket-Programmiermodell beschrieben. Die Socketunterstützung wird von der CSocket-Klasse auf einer höheren Abstraktionsebene bereitgestellt als von der CAsyncSocket-Klasse. CSocket verwendet eine Version des MFC-Serialisierungsprotokolls, um Daten über ein CArchive-MFC-Objekt an ein Socketobjekt zu übergeben bzw. von diesem Objekt zu empfangen. CSocket ermöglicht die Blockierung (während Windows-Meldungen im Hintergrund verarbeitet werden) und bietet Zugriff auf CArchive. CArchive verwaltet zahlreiche Aspekte der Kommunikation, die Sie andernfalls über die unformatierte API oder die CAsyncSocket-Klasse selbst vornehmen müssten.

    > MSDN

    link: [url] http://msdn.microsoft.com/library/en-us/vccore/html/_core_Windows_Sockets.3a_.How_Sockets_with_Archives_Work.asp?frame=true[/url]

    MfG
    ExElNeT

    [ Dieser Beitrag wurde am 22.11.2002 um 16:55 Uhr von ExElNeT editiert. ]



  • Hab ich gar nix dagegen, trotzdem ruft man die Funktion Serialize nicht direkt auf.
    Um Objekte zu serialisieren, wird die Funktion ReadObject von CArchive aufgerufen, welche ihrerseits Serialize von CObject aufruft!

    Schönes Beispiel aus MSDN:

    CFile myFile("myfile.dat", CFile::modeCreate | CFile::modeReadWrite);
    CAge  age(21), *pAge;
    
    // Create a storing archive.
    CArchive arStore(&myFile, CArchive::store);
    
    // Write the object to the archive
    arStore.WriteObject( &age );
    
    // Close the storing archive
    arStore.Close();
    
    // Create a loading archive.
    myFile.SeekToBegin();
    CArchive arLoad(&myFile, CArchive::load);
    
    // Verify the object is in the archive.
    pAge = (CAge*) arLoad.ReadObject( RUNTIME_CLASS(CAge) );
    ASSERT( age == *pAge );
    

    Jetzt ersetze noch CAge durch CObArray, dann kommt das ganze schon eher hin!



  • Eine korrekt geschriebene Serialize Funktion ruft immer die Serialize Methode der Oberklasse auf. Ohne dieses System hätte es garkeinen Sinn. Aber das ist nicht das Problem. Ich kann es ja mal mit der vorgeschlagenen Funktion testen bin aber der Meinung das sich dort nicht viel ändert... In Files funktioniert mein System sehr gut. Auch in der MSDN sind Beispiele mit Direktaufrufen von Serialize().

    Danke für deine Hilfe
    MfG
    ExElNeT


Anmelden zum Antworten